使用LINQ与实现非泛型ICollection的类(Using LINQ with classes

2019-07-29 20:39发布

我想跑针对LINQ查询MatchCollection对象,但发现它没有实现,这是不可能ICollection<T>只是ICollection

什么是使用LINQ与非泛型集合的最佳选择,无论是在代码简洁方面,而且性能和内存使用情况?

(如果有兴趣,这里是不LINQuified代码:)

MatchCollection fieldValues = Regex.Matches(fieldValue, @"(?<id>\d+);#(?<text>[^;|^$]+)");
foreach (Match m in fieldValues)
{
    if (m.Groups["text"].Value.Equals(someString))
    {
        // Do stuff
    }
}

Answer 1:

您可以包括你的someString与LINQ筛选器。

var matches = Regex.Matches(fieldValue, @"(?<id>\d+);#(?<text>[^;|^$]+)");
var textMatches = from Match m in matches
                  where m.Groups["text"].Value.Equals(someString)
                  select m;

foreach (Match m in textMatches)
{
    // Do stuff
}

请注意,编译器将这样的查询...

var q = from MyType x in myEnum select x;

...这个...

var q = from x in myEnum.Cast<MyType>() select x;

...所以包括的类型和Cast<T>()是多余的。

性能的角度来看, Cast<T>()只是做一个显式的类型转换和产生的值,所以性能命中将是微不足道的。 对于那些你不知道的所有成员都需要的类型的传统的集合,你可以使用OfType<T>()代替。



Answer 2:

尝试使用Cast扩展方法将返回一个IEnumerable。

IEnumerable<Match> query = from Match m in fieldValues.Cast<Match>()
                           select m;

和事件,如果你不使用的铸造方法,编译器会推断出“查询”,以IEnumerable的类型。

  var query = from Match v in fieldValues
                        select v;


文章来源: Using LINQ with classes implementing non-generic ICollection