使用LINQ实现非泛型ICollection的类

时间:2009-07-08 11:32:55

标签: .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
    }
}

2 个答案:

答案 0 :(得分: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
}

请注意,编译器会像这样翻译...

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>()代替。

答案 1 :(得分:3)

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

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

如果您不使用Cast方法,则编译器将推断IEnumerable的“查询”类型。

  var query = from Match v in fieldValues
                        select v;