12

我想对一个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
    }
}
4

2 回答 2

12

您也可以在 LINQ 中包含您的someString过滤器。

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>()改用。

于 2009-07-09T01:00:47.237 回答
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;
于 2009-07-08T11:57:38.957 回答