Визуальный безопасный источник (VSS) хорошо для новичка, потому что Вы не будете знать то, что Вы пропускаете. Когда Вы нуждаетесь в чем-то более сложном, затем волнуетесь о получении некоторого другого продукта.
Вероятно, это не то, что вы ищете, но если у вас есть контроль над этим, наиболее эффективным способом было бы вообще не добавлять их ...
Вы контролируете это? Если это так, все, что вам нужно сделать, это вызвать myList.Contains (currentItem)
, прежде чем вы добавите элемент и установите
Просто помните, когда вы предоставляете настраиваемый класс для переопределения метода Equals (), чтобы Contains () функционировал должным образом.
Пример
List<CustomClass> clz = new List<CustomClass>()
public class CustomClass{
public bool Equals(Object param){
//Put equal code here...
}
}
Я не доктор наук в области компьютерных наук, но я могу представить, что использую словарь с элементами в вашем списке, так как ключи будут быстрыми.
Поскольку словарь не позволяет повторяющиеся ключи, у вас будут только уникальные строки в конце итерации.
Если вы идете по маршруту «просто не добавляйте дубликаты», то проверка «List.Contains» перед добавлением элемента работает , но его O ( n ^ 2), где n - числовые строки, которые вы хотите добавить. Это не отличается от вашего текущего решения, использующего два вложенных цикла.
Вам больше повезет, если вы используете хэш-набор для хранения элементов, которые вы уже добавили, но поскольку вы используете .NET 2.0, словарь может заменить хэш set:
static List<T> RemoveDuplicates<T>(List<T> input)
{
List<T> result = new List<T>(input.Count);
Dictionary<T, object> hashSet = new Dictionary<T, object>();
foreach (T s in input)
{
if (!hashSet.ContainsKey(s))
{
result.Add(s);
hashSet.Add(s, null);
}
}
return result;
}
Это выполняется за O (n) и использует пространство O (2n), это обычно очень хорошо работает для элементов размером до 100K. Фактическая производительность зависит от средней длины строк - если вам действительно нужна максимальная производительность, вы можете использовать некоторые более мощные структуры данных, такие как попытки сделать вставку еще быстрее.
Вы можете сделать следующее.
List<string> list = GetTheList();
Dictionary<string,object> map = new Dictionary<string,object>();
int i = 0;
while ( i < list.Count ) {
string current = list[i];
if ( map.ContainsKey(current) ) {
list.RemoveAt(i);
} else {
i++;
map.Add(current,null);
}
}
Это накладные расходы на создание объекта Dictionary
, который будет дублировать список уникальных значений в списке. Но с точки зрения скорости это довольно эффективно.