使用HashSet在列表中添加新的不同子列表

时间:2017-02-23 12:51:29

标签: c# list hashset sublist

仅当子列表与列表subroute中的其他子列表不同时,我才想在列表Zlist中添加新的子列表Zlist。以下是Zlist和初始sublists的定义:

HashSet<Matrix> Zlist = new HashSet<Matrix>();
for (int m = 0; m < M; m++)
{
    for (int i = 1; i < C + 1; i++)
    {
        Zlist.Add(new Matrix() {Column = {m,i}});
    }
}

这里是<Matrix>

的定义
class Matrix
{
    public List<int> Column { get; set; }

    public Matrix()
    {
        Column = new List<int>();
    }
}

这就是我将subroute添加到Zlist的方式:

foreach (var subroute in route)
    Zlist.Add(new Matrix() { Column = subroute});

就我而言,另一个名为route的列表包含2个subroute。其中只有一个是新的。但根据我的代码,Zlist仍会添加所有subroute。我已经把HashSet放了但是没用。请帮助,谢谢

1 个答案:

答案 0 :(得分:0)

你必须告诉HashMap如何进行比较,因为它们是引用类型。

public class MatrixComparer : IEqualityComparer<Matrix>
{
    public bool Equals(Matrix x, Matrix y)
    {
        if (x.Column.Count != y.Column.Count) return false;
        return !x.Column.Where((t, i) => t != y.Column[i]).Any();
    }

    public int GetHashCode(Matrix obj)
    {
        return obj.Column.Aggregate((i1, i2) => i1 ^ i2);
    }
}

并在HashMap中发送:

HashSet<Matrix> Zlist = new HashSet<Matrix>(new MatrixComparer() );