باستخدام LinQ مع فئات تنفيذ icollection غير عامة
-
11-09-2019 - |
سؤال
أردت تشغيل استعلام LINQ ضد MatchCollection
كائن ولكن وجدت أن هذا غير ممكن لأنه لا ينفذ ICollection<T>
, ، فقط ICollection
.
ما هو الخيار الأفضل لاستخدام LINQ مع مجموعات غير عامة، سواء من حيث موجزات التعليمات البرمجية ولكن أيضا الأداء واستخدام الذاكرة؟
(إذا كانت مهتمة، فإليك التعليمات البرمجية غير المحددة :)
MatchCollection fieldValues = Regex.Matches(fieldValue, @"(?<id>\d+);#(?<text>[^;|^$]+)");
foreach (Match m in fieldValues)
{
if (m.Groups["text"].Value.Equals(someString))
{
// Do stuff
}
}
المحلول
يمكنك تضمين الخاص بك 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>()
في حين أن.
نصائح أخرى
حاول استخدام طريقة التمديد المصبوب والتي سترجع iEnumerable.
IEnumerable<Match> query = from Match m in fieldValues.Cast<Match>()
select m;
والحدث إذا كنت لا تستخدم الطريقة المصبوبة، فسوف يستنتج المحول البرمجي نوع "الاستعلام" إلى iEnumperable.
var query = from Match v in fieldValues
select v;