سؤال

أنا أكتب مرجع LINQ الخاص بي ، لكنني أتلقى مشكلات مع بعض تطبيقات المشغلين الأكثر تعقيدًا.

هناك تنفيذ انضمام يأخذ iequalitycomparer أنا أشعر بالجنون.

أحاول أن أفهمها أولاً قبل أن أكتب (من الواضح)

صورة هذه القائمتين:

List<string> initials = new List<string> {"A", "B", "C", "D", "E"};

List<string> words = new List<string> {"Ant", "Crawl", "Pig", "Boat", "Elephant", "Arc"};

لا شيء غريب هنا. أريد الانضمام إلى كلتا القائمتين من قبل الأولي ، شيء مثل:

الأولي = كلمة = ant
الأولي = كلمة = قوس
الأولي = B كلمة = قارب
...

أحتاج إلى مقارنة ، كتبت هذا:

public class InitialComparator : IEqualityComparer<string>
{
    public bool Equals(string x, string y)
    {
        return x.StartsWith(y);
    }

    public int GetHashCode(string obj)
    {
        return obj[0].GetHashCode();
    }
}

الانضمام نفسه:

var blah = initials.Join(words,
                                  initial => initial,
                                  word => word,
                                  (initial, word) =>
                                  new {Initial = initial, Word = word},
                                  new InitialComparator());

إنها المرة الأولى التي أستخدم فيها Hashcodes ، بعد جلسة جيدة من تصحيح الأخطاء ، أرى أن كل كلمة تذهب إلى المقارنة والنظر إلى Hashcode ، إذا كانت كلمة أخرى تحتوي على نفس الرمز الذي يستدعيه يساوي.

بما أنني أرغب في مقارنته فقط ، على الرغم من أنني بحاجة فقط إلى علامة الحرف الأول (هل أنا مخطئ؟)

الشيء هو أن هذا لا يعمل بشكل صحيح. يقول أن "ANT" و "ARC" متساوين ، حسناً ، مقارنة كل كلمة في نفس القائمة أم لا ، ولكنها تضيف فقط الكلمة الأخيرة التي يجدها ، في هذه الحالة ، تجاهل النمل والنمل يساوي "أ" " جدا...

إذا وضعت "النملة" و "النمل" ، فإنها تضيف كليهما.

باختصار ، ما هي طريقة القيام بشيء من هذا القبيل؟ أعلم أنني أفعل شيئًا خاطئًا.

شكرًا لك.

هل كانت مفيدة؟

المحلول

كما ذكر Crispy Try X [0] == y [0] بدلاً من x.startswith (y) ؛ التي عملت بالنسبة لي.

نصائح أخرى

لا تحتاج فعليًا إلى مقارنتك المساواة ، فقط انضم إلى الرسالة الفردية مثل:

var mine = from i in initials
     join w in words on i[0] equals w[0]
     select new {
          Initial = i,
          Words = w
     };

لست متأكدًا من سبب رؤية هذا السلوك ، لكنني أعتقد أن استخدام "Selectany" سيكون نهجًا أكثر وضوحًا و (الأهم من ذلك) لديه السلوك الذي تريده:

var blah =
    from word in words
    from initial in initials
    where (word.StartsWith(initial))
    select new { Initial = initial, Word = word };

أفضل استخدام بناء جملة الفهم حيثما كان ذلك ممكنًا. يتم استدعاء "Selectany" عندما يكون هناك متعددة "من" البنود في استعلام الفهم.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top