سؤال

أردت تشغيل استعلام 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;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top