我想针对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
}
}
答案 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;