删除c#中的重复列表

时间:2013-12-03 11:50:28

标签: c# generic-list

如何删除重复的商家信息?

我的课程:

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。其中一个应该保留

4 个答案:

答案 0 :(得分:2)

以下查询对第一个测试实例进行测试,测试实例具有相同的分数。然后你只需选择组密钥:

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

返回user1user2。与lambda语法相同:

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

如果您希望保留最后一位用户,请将First更改为Last,但此处First效率更高,因为它会提前停止枚举。

答案 1 :(得分:0)

有两种方法可以做到这一点:

  1. 创建一个for循环并删除双重条目:

    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]检查是否相等,并在相等时删除项目

答案 2 :(得分:0)

你可以使用Linq函数Distinct()(tests.Distinct(...)) 并提供一个IEqualityComparer实例,用于检查您的分数是否相同

答案 3 :(得分: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();