使用LINQ与实现非泛型ICollection的类
-
11-09-2019 - |
题
我想跑针对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
}
}
解决方案
您可以包括与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>()
代替传统的收藏品。
其他提示
尝试使用Cast扩展方法,该方法将返回一个IEnumerable。
IEnumerable<Match> query = from Match m in fieldValues.Cast<Match>()
select m;
和事件,如果你不使用Cast方法,编译器会推断出“查询”,以IEnumerable的类型。
var query = from Match v in fieldValues
select v;
不隶属于 StackOverflow