Список для максимально быстрого поиска по нему - C#

Узнай цену своей работы

Формулировка задачи:

Сейчас у меня есть два списка строк -

List<string>

один

MainBase

, второй

TempBase

, мне надо выбрать из

TempBase

все строчки, которых нет в

MainBase

, ну что бы потом их добавить в

MainBase

. Программа работает в многопоточном режиме, много этих

MainBase

и они относительно большие, короче при относительном количестве потоков неплохо загружает процессор, я так подозреваю из за поиска. Сейчас выборку я делаю так:
Листинг программы
  1. List<string> NewList = (from item in TempBase
  2. let temp = item.Replace(SameText, "").Trim()
  3. where
  4. string.IsNullOrEmpty(temp) == false && MainBase.Contains(temp) == false
  5. select temp).ToList();
тут есть нюанс, перед поиском с переменной осуществляется некоторое действие и только после этого идет поиск:
Листинг программы
  1. let temp = item.Replace(SameText, "").Trim()
Подскажите, что не так, как можно ускорить, может есть еще какой то список в котором поиск будет осуществляться быстрее (ну допустим в нем элементы будут не просто добавятся по очередной, а сортироваться как то так) и еще вопрос, на сколько я помню существует такая штука как бинарное дерево, есть в фреймворке готовый вариант?

Решение задачи: «Список для максимально быстрого поиска по нему»

textual
Листинг программы
  1. static void Tester()
  2. {
  3.     List<string> mainFile = new List<string>(); // 532641 строк
  4.     List<string> secondFile = new List<string>(); // 150309 строк
  5.    
  6.     TestSortedSet(mainList, secondList);
  7.     TestHashSet(mainList, secondList);
  8.     TestLinq(mainList, secondList);
  9.     TestFor(mainList, secondList);
  10.     TestExt(mainList, secondList);
  11. }
  12.  
  13. static void TestHashSet(List<string> mainFile, List<string> secondFile)
  14. {
  15.     Console.WriteLine("TestHashSet");
  16.     Stopwatch sw = new Stopwatch();
  17.     sw.Start();
  18.     HashSet<string> hs = new HashSet<string>(mainFile);
  19.     sw.Stop();
  20.     Console.WriteLine("Размер списка: {0}, времени понадобилось: {1}", mainFile.Count, sw.ElapsedMilliseconds);
  21.  
  22.     sw.Reset();
  23.     int countDo = mainFile.Count;
  24.  
  25.     sw.Start();
  26.     for (int i = 0; i < secondFile.Count; i++) hs.Add(secondFile[i].Trim());
  27.     sw.Stop();
  28.  
  29.     Console.WriteLine("Новый размер списка: {0}, новых элементов: {1}, времени понадобилось: {2}", hs.Count, (hs.Count - countDo), sw.ElapsedMilliseconds);
  30.     Console.WriteLine();
  31. }
  32.  
  33.  
  34. static void TestSortedSet(List<string> mainFile, List<string> secondFile)
  35. {
  36.     Console.WriteLine("TestSortedSet");
  37.     Stopwatch sw = new Stopwatch();
  38.     sw.Start();
  39.     SortedSet<string> ss = new SortedSet<string>(mainFile);
  40.     sw.Stop();
  41.     Console.WriteLine("Размер списка: {0}, времени понадобилось: {1}", mainFile.Count, sw.ElapsedMilliseconds);
  42.  
  43.     sw.Reset();
  44.     int countDo = mainFile.Count;
  45.  
  46.     sw.Start();
  47.     for (int i = 0; i < secondFile.Count; i++) ss.Add(secondFile[i].Trim());
  48.     sw.Stop();
  49.  
  50.     Console.WriteLine("Новый размер списка: {0}, новых элементов: {1}, времени понадобилось: {2}", ss.Count, (ss.Count - countDo), sw.ElapsedMilliseconds);
  51.     Console.WriteLine();
  52. }
  53.  
  54.  
  55. static void TestLinq(List<string> mainFile, List<string> secondFile)
  56. {
  57.     Console.WriteLine("TestLinq");
  58.     Stopwatch sw = new Stopwatch();
  59.  
  60.     sw.Start();
  61.     List<string> NewList = (from item in secondFile
  62.                          let temp = item.Trim()
  63.                          where
  64.                             mainFile.Contains(temp) == false
  65.                             select temp).ToList();
  66.     sw.Stop();
  67.  
  68.     Console.WriteLine("Новых элементов: {0}, Времени понадобилось: {1}", NewList.Count, sw.ElapsedMilliseconds);
  69.     Console.WriteLine();
  70. }
  71.  
  72.  
  73. static void TestFor(List<string> mainFile, List<string> secondFile)
  74. {
  75.     Console.WriteLine("TestFor");
  76.     Stopwatch sw = new Stopwatch();
  77.  
  78.     List<string> NewList = new List<string>();
  79.  
  80.     sw.Start();
  81.     for (int i = 0; i < secondFile.Count; i++)
  82.     {
  83.         string temp = secondFile[i].Trim();
  84.         if (mainFile.Contains(temp) == false) NewList.Add(temp);
  85.     }
  86.     sw.Stop();
  87.  
  88.     Console.WriteLine("Новых элементов: {0}, Времени понадобилось: {1}", NewList.Count, sw.ElapsedMilliseconds);
  89.     Console.WriteLine();
  90. }
  91.  
  92.  
  93. static void TestExt(List<string> mainFile, List<string> secondFile)
  94. {
  95.     Console.WriteLine("TestExt");
  96.     Stopwatch sw = new Stopwatch();
  97.  
  98.     sw.Start();
  99.     List<string> NewList = secondFile.Select(i => i.Trim()).Except(mainFile).ToList();
  100.     sw.Stop();
  101.  
  102.     Console.WriteLine("Новых элементов: {0}, Времени понадобилось: {1}", NewList.Count, sw.ElapsedMilliseconds);
  103.     Console.WriteLine();
  104. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 3.8 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы