Dot-Net

將 LINQ 與實現非泛型 ICollection 的類一起使用

  • July 9, 2009

我想對一個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>()改用。

引用自:https://stackoverflow.com/questions/1097486