我有一个MerkmalSet
类,它从方法Merkmalls
的{{1}}列表中删除重复项。但是,要针对它以使其与众不同,我应该如何更改方法。
RemoveAllInstancesOfDuplicates
答案 0 :(得分:1)
您首先需要创建一个IEqualityComparer<MerkmalRow>
来比较MerkmalRow
个对象。
public class MerkmalRowComparer : IEqualityComparer<MerkmalRow>
{
bool IEqualityComparer<MerkmalRow>.Equals(MerkmalRow x, MerkmalRow y)
{
// reference equality
if (ReferenceEquals(x, y)) return true;
// check for null
if (ReferenceEquals(x, null) || ReferenceEquals(y, null))
return false;
// check if each property is the same value
return x.Name == y.Name && x.Wert == y.Wert;
}
int IEqualityComparer<MerkmalRow>.GetHashCode(MerkmalRow obj)
{
unchecked
{
var hashCode = obj.Name != null ? obj.Name.GetHashCode() : 0;
hashCode = (hashCode * 397) ^ (obj.Wert != null ? obj.Wert.GetHashCode() : 0);
return hashCode;
}
}
}
然后使用LINQ的Distinct
方法,将比较器对象传递给它,以便它知道如何比较列表中的每个对象:
public void RemoveAllInstancesOfDuplicates()
{
Merkmalls = Merkmalls.Distinct(new MerkmalRowComparer()).ToList();
}
答案 1 :(得分:1)
正如Mayhem建议的那样,您可以使用哈希集。为此,您需要将MerkmalRow
声明为Struct
(或实现相等性)
using Xunit;
using System.Collections.Generic;
using System.Linq;
using System;
public struct MerkmalRow
{
public string Name { get; }
public string Wert { get; }
public MerkmalRow(string name, string wert)
{
Name = name;
Wert = wert;
}
}
public class MerkmalSet
{
public HashSet<MerkmalRow> Merkmalls = new HashSet<MerkmalRow>();
public void AddNewRow(MerkmalRow newRow) => Merkmalls.Add(newRow);
}
public class Tests
{
[Fact]
public void DuplicatesAreNotAdded()
{
var merkmalSet = new MerkmalSet();
merkmalSet.AddNewRow(new MerkmalRow("1", "2"));
merkmalSet.AddNewRow(new MerkmalRow("1", "2"));
merkmalSet.AddNewRow(new MerkmalRow("1", "2"));
merkmalSet.AddNewRow(new MerkmalRow("1", "3"));
Assert.Equal(2, merkmalSet.Merkmalls.Count);
}
}
答案 2 :(得分:0)
如果您实际上想在列表中保留单个项目实例(无重复),则可以使用以下方法
public void RemoveDuplicates()
{
set = new HashSet<MerkmalRow>(Merkmalls);
Merkmalls = set.ToList();
}
如ingvar所述,该链接还建议您可以使用LINQ来更新列表,例如Merkmalls = Merkmalls.Distinct().ToList();
答案 3 :(得分:0)
尝试此方法,而不要考虑所有并发症:
Merkmalls = Merkmalls
.GroupBy(x => new { Name = x.Name, Wert= x.Wert})
.Select(g => g.First())
.ToList();
以及用于删除所有重复项:
Merkmalls = Merkmalls
.GroupBy(x => new { Name = x.Name, Wert= x.Wert})
.Where(g => g.Count() == 1)
.Select(g => g.First())
.ToList();
我总是更喜欢使用LinQ的功能,而不是创建自己的方法。