如何删除重复的商家信息?
我的课程:
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。其中一个应该保留
答案 0 :(得分:2)
以下查询对第一个测试实例进行测试,测试实例具有相同的分数。然后你只需选择组密钥:
from t in tests
group t by tests.First(x => Enumerable.SequenceEqual(x.Scores, t.Scores)) into g
select g.Key;
返回user1
和user2
。与lambda语法相同:
tests.GroupBy(t => tests.First(x => Enumerable.SequenceEqual(x.Scores,t.Scores)))
.Select(g => g.Key);
如果您希望保留最后一位用户,请将First
更改为Last
,但此处First
效率更高,因为它会提前停止枚举。
答案 1 :(得分:0)
有两种方法可以做到这一点:
创建一个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--;
}
}
在您的班级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();