Как проверить, содержит ли список <string>какое-либо строковое значение или нет - PullRequest
1 голос
/ 14 октября 2011

Код ниже - это элемент списка.

List <string> lsLinks = new List<string>();

Прежде чем добавлять новые строки, я хочу проверить, содержит ли список строку, которую я собираюсь добавить, или нет.Как я могу сделать это наиболее эффективным способом.

Я могу перебирать весь список и проверять, но я думаю, что это не повлияет на производительность.

Ответы [ 6 ]

11 голосов
/ 14 октября 2011

Самый эффективный способ заключается в простом использовании HashSet<T>, либо вместо списка (если порядок не имеет значения), либо в дополнение в список, если это так.

т.е. либо

HashSet<string> lsLinks = new HashSet<string>();
// now just Add() all you like; only ever one of each, but order is not defined

или

List<string> lsLinks = new List<string>();
HashSet<string> unique = new HashSet<string>();
// now, when needed, check if the item is new to "unique"
if(unique.Add(newValue)) lsLinks.Add(newValue);

Вы также можете найти использование для .Distinct() в LINQ, т.е.

var uniqueList = someSourse.Distinct().ToList();
6 голосов
/ 14 октября 2011

Если у вас есть , чтобы иметь List<string>, и вы не можете сначала отсортировать его, то нет ничего, что вы можете сделать, что будет быстрее, чем простой Contains, который обходит всесписок.Если список отсортирован, вы можете вместо этого выполнить бинарный поиск.

Если вместо этого вы можете использовать HashSet<string>, это, очевидно, будет намного быстрее, когда набор станет больше.(Для небольших наборов разница в производительности, вероятно, не имеет значения.)

Обратите внимание, что HashSet<T> делает не , хотя сохраняет порядок элементов - так что, если это важно для вас, выможет захотеть оставить HashSet<string> и a List<string>.Затем вы можете сделать:

if (stringSet.Add(newValue))
{
    stringList.Add(newValue);
}

Обратите внимание, что если вы в настоящее время просто обеспокоены производительностью в резюме, вам следует установить соответствующие цели, чтобы определить, что достаточно достаточно быстро , и измеритьпротив этих целей - при написании простейшего кода.Знаете ли вы, что на самом деле список станет большим в вашем реальном приложении?

2 голосов
/ 14 октября 2011

Вы можете использовать HashSet вместо List <>, если вам не важен порядок элементов. Эта коллекция специально разработана для обеспечения максимальной скорости операций сравнения, поскольку использует хэши.

2 голосов
/ 14 октября 2011

Вы можете использовать следующее:

 lsLinks.Contains(myString);

или

 lsLinks.Where(o=>o==myString);

Но если ваша цель - обеспечить уникальные строки, вы можете использовать HashSet вместо List, еслипорядок строк не важен.

2 голосов
/ 14 октября 2011
List <string> lsLinks = new List<string>();
bool contains = lsLinks.Any(s => s.Equals("myString");
1 голос
/ 14 октября 2011

Я не уверен, что понял, что вы хотели, но попробуйте это:

if(!lsLinks.Contains(NewString)) lsLinks.Add(NewString)
...