انضم إلى + iequalitycomparer و hashcode
-
23-09-2019 - |
سؤال
أنا أكتب مرجع 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" عندما يكون هناك متعددة "من" البنود في استعلام الفهم.