2013-12-03 4 views
0

Как удалить дубликат списка?удалить дублирующийся список в C#

Мой класс:

public class test 
{ 
    public string UserName { get; set; } 
    public List<int> Scores { get; set; } 
} 

Выборочные данные

var tests = new List<test> { 
       new test 
       { 
        Scores = new List<int> { 1, 2, 3 }, 
        UserName = "user1" 
       }, 
       new test 
       { 
        Scores = new List<int> { 1, 5, 3 }, 
        UserName = "user2" 
       }, 
       new test 
       { 
        Scores = new List<int> { 1, 2, 3 }, 
        UserName = "user3" 
       } 
      }; 

Мне нужно удалить дубликаты на основе баллов.

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

Сценарий: user1 и user3 повторяется.

user1 или user3 Должно быть removed.One из двух должен остаться

+1

Условие, которое определяет, что user1 и user3 являются дубликатами, нечеткое. Пожалуйста, объясните лучше –

ответ

2

Следующие группы групп запросов проверяют первый тестовый экземпляр, который имеет одинаковые оценки. Тогда вы просто выбрать группу ключей:

from t in tests 
group t by tests.First(x => Enumerable.SequenceEqual(x.Scores, t.Scores)) into g 
select g.Key; 

Возвращает user1 и user2. То же самое с лямбда-синтаксисом:

tests.GroupBy(t => tests.First(x => Enumerable.SequenceEqual(x.Scores,t.Scores))) 
    .Select(g => g.Key); 

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

0

Есть 2 способа сделать это:

  1. Сделайте цикл и удалить двойные записи:

    var namesFound = new List<string>(); 
    for (int i = 0; i < tests.Count; i++) 
    { 
        if (!namesFound.Contains(tests[i].UserName)) 
        { 
         namesFound.Add(tests[i].UserName); 
        } 
        else 
        { 
         tests.Remove(tests[i]); 
         i--; 
        } 
    } 
    
  2. Внесите IEqualityComparer на свой класс test. Проверить эту ссылку: http://msdn.microsoft.com/en-us/library/ms132151(v=vs.110).aspx
    После этого проверки на равенство с помощью tests[0] == tests[1] и удаления элемента, когда они равны

0

Вы можете использовать функцию Linq Distinct() (tests.Distinct (...)) и предоставить экземпляр IEqualityComparer, который проверяет, совпадают ли ваши оценки.

0

Предоставьте обычай IEqualityComparer<test> методу Distinct и проделайте эту работу.

internal class TestComparer : IEqualityComparer<test> 
{ 
    public bool Equals(test x, test y) 
    { 
     if (x.Scores.Count != y.Scores.Count) 
      return false; 
     return new HashSet<int>(x.Scores).SetEquals(y.Scores); 
    } 
    public int GetHashCode(test obj) 
    { 
     return obj.Scores.Aggregate((seed,x)=> seed | x); 
    } 
} 

var filteredList = tests.Distinct(new TestComparer()).ToList(); 
Смежные вопросы