使用LINQ实现非泛型ICollection的类

Ale*_*gas 12 .net linq generics linq-to-objects icollection

我想对一个MatchCollection对象运行一个LINQ查询,但发现这是不可能的,因为它没有实现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
    }
}
Run Code Online (Sandbox Code Playgroud)

dah*_*byk 11

您也可以将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
}
Run Code Online (Sandbox Code Playgroud)

请注意,编译器会像这样翻译一个查询...

var q = from MyType x in myEnum select x;
Run Code Online (Sandbox Code Playgroud)

......进入这...

var q = from x in myEnum.Cast<MyType>() select x;
Run Code Online (Sandbox Code Playgroud)

...所以包括类型和Cast<T>()冗余.

性能方面,Cast<T>()只是进行显式类型转换并产生值,因此性能损失可以忽略不计.对于您不确定所有成员都是所需类型的旧版集合,您可以OfType<T>()改为使用.