我想跑针对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;
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top