自定义类列表中的不同值

时间:2018-10-14 20:40:03

标签: c#

我有一个MerkmalSet类,它从方法Merkmalls的{​​{1}}列表中删除重复项。但是,要针对它以使其与众不同,我应该如何更改方法。

RemoveAllInstancesOfDuplicates

4 个答案:

答案 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的功能,而不是创建自己的方法。