Удаление дублирующейся строки из Списка (.NET 2.0!)

Визуальный безопасный источник (VSS) хорошо для новичка, потому что Вы не будете знать то, что Вы пропускаете. Когда Вы нуждаетесь в чем-то более сложном, затем волнуетесь о получении некоторого другого продукта.

5
задан greggorob64 26 August 2009 в 15:30
поделиться

5 ответов

Вероятно, это не то, что вы ищете, но если у вас есть контроль над этим, наиболее эффективным способом было бы вообще не добавлять их ...

Вы контролируете это? Если это так, все, что вам нужно сделать, это вызвать myList.Contains (currentItem) , прежде чем вы добавите элемент и установите

15
ответ дан 18 December 2019 в 06:03
поделиться

Просто помните, когда вы предоставляете настраиваемый класс для переопределения метода Equals (), чтобы Contains () функционировал должным образом.

Пример

List<CustomClass> clz = new List<CustomClass>()

public class CustomClass{

    public bool Equals(Object param){
        //Put equal code here...
    }
}
1
ответ дан 18 December 2019 в 06:03
поделиться

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

Поскольку словарь не позволяет повторяющиеся ключи, у вас будут только уникальные строки в конце итерации.

1
ответ дан 18 December 2019 в 06:03
поделиться

Если вы идете по маршруту «просто не добавляйте дубликаты», то проверка «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. Фактическая производительность зависит от средней длины строк - если вам действительно нужна максимальная производительность, вы можете использовать некоторые более мощные структуры данных, такие как попытки сделать вставку еще быстрее.

1
ответ дан 18 December 2019 в 06:03
поделиться

Вы можете сделать следующее.

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 , который будет дублировать список уникальных значений в списке. Но с точки зрения скорости это довольно эффективно.

9
ответ дан 18 December 2019 в 06:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: