في C#، ما هي أسرع طريقة للبحث عن عناصر في قائمة ولكن قم بإجراء بحث "Startswith ()"؟

StackOverflow https://stackoverflow.com/questions/19849923

سؤال

لدي قائمة بالسلاسل:

 var list = new List<string>();
 list.Add("CAT");
 list.Add("DOG");

var listofItems = new List<string>();
 listofItems .Add("CATS ARE GOOD");
 listofItems .Add("DOGS ARE NICE");
 listofItems .Add("BIRD");
 listofItems .Add("CATAPULT");
 listofItems .Add("DOGGY");

والآن أريد وظيفة مثل هذه:

 listofItems.Where(r=> list.Contains(r));

ولكن بدلاً من احتوائها ، أريد أن تقوم بدايات بالتحقق بحيث يتم إرجاع 4 من أصل 5 عناصر (لن يتم ذلك).

ما هي أسرع طريقة للقيام بذلك؟

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

المحلول

يمكنك استخدام ابدا ب داخل أي

listofItems.Where(item=>list.Any(startsWithWord=>item.StartsWith(startsWithWord)))

يمكنك تصور هذا على أنه مزدوج for حلقة ، مع الثانية for الخروج بمجرد أن يضرب أ true قضية

var filteredList = new List<String>();
foreach(var item in listOfItems)
{
    foreach(var startsWithWord in list)
    {
        if(item.StartsWith(startsWithWord))
        {
            filteredList.Add(item)
            break;
        }
    }
}
return filteredList;

نصائح أخرى

أسرع طريقة هي استخدام بنية بيانات أخرى ، على سبيل المثال تري. يمكن العثور على تنفيذ C# الأساسي هنا: https://github.com/kpol/trie

يجب أن يحصل هذا على ما تحتاجه بتنسيق أكثر بساطة:

 var result = listofItems.Select(n =>
 {
      bool res = list.Any(v => n.StartsWith(v));
      return res 
               ? n 
               : string.Empty;
 }).Where(b => !b.Equals(string.Empty));

هيكل بيانات Trie هو ما تحتاجه. ألقِ نظرة على هذه المكتبة الأكثر نضجًا: ترينت

using Gma.DataStructures.StringSearch;

...

var trie = new SuffixTrie<int>(3);

trie.Add("hello", 1);
trie.Add("world", 2);
trie.Add("hell", 3);

var result = trie.Retrieve("hel");
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top