Избегайте добавления повторяющихся элементов в список С# - программирование
Подтвердить что ты не робот

Избегайте добавления повторяющихся элементов в список С#

string[] lines3 = new string[100];
List<string> lines2 = new List<string>();
lines3 = Regex.Split(s1, @"\s*,\s*");

if (!lines2.Contains(lines3.ToString()))
{
    lines2.AddRange(lines3.Distinct().ToArray());
}

Я проверил все пробелы и т.д., но все равно получаю повторяющиеся значения в моих строках2 List

Мне нужно удалить мои повторяющиеся значения здесь

4b9b3361

Ответ 1

Ваша проверка:

if (!lines2.Contains(lines3.ToString()))

неверно. Вы проверяете, содержит ли ваш lines2 System.String[], так как lines3.ToString() предоставит вам это. Вам нужно проверить, существует ли элемент из lines3 в lines2 или нет.

Вы можете перебирать каждый элемент в lines3, если он существует в lines2, а затем добавить его. Что-то вроде.

foreach (string str in lines3)
{
    if (!lines2.Contains(str))
        lines2.Add(str);
}

Или, если ваш lines2 - любой пустой список, вы можете просто добавить в список lines3 различные значения, например:

lines2.AddRange(lines3.Distinct());

то ваш lines2 будет содержать различные значения.

Ответ 2

Вы можете использовать Enumerable.Except, чтобы получить отдельные элементы из строк 3, которые не находятся в строках2:

lines2.AddRange(lines3.Except(lines2));

Если строки2 содержат все элементы из строк3, то ничего не будет добавлено. BTW внутренне Except использует Set<string> для получения отдельных элементов из второй последовательности и для проверки тех элементов, которые присутствуют в первой последовательности. Итак, это довольно быстро.

Ответ 3

Используйте HashSet<string> вместо List<string>. Он готов к повышению производительности, потому что вам не нужно проверять какие-либо предметы. Коллекция будет управлять им для вас. В этом разница между a list и a set. Для образца:

HashSet<string> set = new HashSet<string>();

set.Add("a");
set.Add("a");
set.Add("b");
set.Add("c");
set.Add("b");
set.Add("c");
set.Add("a");
set.Add("d");
set.Add("e");
set.Add("e");

var total = set.Count;

Всего 5, а значения a, b, c, d, e.

Реализация List<T> не дает вам nativelly. Вы можете это сделать, но вы должны обеспечить этот контроль. Для образца это extension method:

public static class CollectionExtensions
{
    public static void AddItem<T>(this List<T> list, T item)
    {
       if (!list.Contains(item))
       {
          list.Add(item);
       }
    }
}

и используйте его:

var list = new List<string>();
list.AddItem(1);
list.AddItem(2);
list.AddItem(3);
list.AddItem(2);
list.AddItem(4);
list.AddItem(5);

Ответ 4

Если вам не нужны дубликаты в списке, используйте HashSet. Таким образом, всем, кто читает ваш код, будет ясно, что ваше намерение было, и у вас будет меньше кода для написания, поскольку HashSet уже обрабатывает то, что вы пытаетесь сделать.

Ответ 5

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

Вы должны проверить каждую строку в массиве:

string[] lines3;
List<string> lines2 = new List<string>();

lines3 = Regex.Split(s1, @"\s*,\s*");

foreach (string s in lines3) {
  if (!lines2.Contains(s)) {
    lines2.Add(s);
  }
}

Однако, если вы начинаете с пустого списка, вы можете использовать метод Distinct для удаления дубликатов, и вам нужна только одна строка кода:

List<string> lines2 = Regex.Split(s1, @"\s*,\s*").Distinct().ToList();

Ответ 6

Вы можете использовать простой Union + Distinct:

var lines = lines2.Union(lines3).Distinct();

Это добавит все элементы из второго списка в первый список и затем вернет все уникальные строки в объединенном списке. Скорее всего, это хорошо работает с большими списками, но это просто.

Ссылка: http://msdn.microsoft.com/en-us/library/bb341731.aspx

Ответ 7

Если вы хотите сохранить отдельные значения в коллекции, вы можете попробовать класс HashSet. Он автоматически удалит повторяющиеся значения и сохранит время кодирования.:)

Ответ 9

Используйте HashSet вместе со своим List:

List<string> myList = new List<string>();
HashSet<string> myHashSet = new HashSet<string>();

public void addToList(string s) {
    if (myHashSet.Add(s)) {
        myList.Add(s);
    }
}

myHashSet.Add(s) вернет true, если s не существует в нем.

Ответ 10

не лучший способ, но скорее быстрое исправление, возьмите bool, чтобы проверить, есть ли в целом списке какая-либо повторяющаяся запись.

bool containsKey;
string newKey;

    public void addKey(string newKey){

         foreach(string key in MyKeys){
           if(key == newKey){
             containsKey = true;
          }
         }

      if(!containsKey){
       MyKeys.add(newKey);
     }else{
       containsKey = false;
     }

    }