c# - 在列表中存储一对整数

标签 c# list integer

如何在列表中存储整数对? 我知道我可以为他们开设一个类,例如:

class Pair  
{
    int i1,i2;
}

但如果我这样做,我将无法使用 Contains 函数来检查给定的对是否在列表中。我该怎么做才能轻松地将整数存储在列表中并检查是否已经存在一对整数?我不能使用表格,因为不知道会有多少对。

编辑:
忘记添加: 在我的程序中,(x, y) 和 (y, x) 对被视为相等。

编辑:
(x,y) 和 (y,x) 在检查 Point 是否在列表中时相等,但 xy 不能交换是因为 xy 表示两点之间的连接(整数是点的 id,不,我不能使用任何引用等...)。当我检查 List 是否包含连接时,它是 (x,y) 还是 (y,x) 并不重要,但稍后我会需要该信息。

最佳答案

如果您使用的是 .NET 4.0,则可以使用 Tuple中的类

var tuple = new Tuple<int, int>(17, 42);
var otherTuple = Tuple.Create(17, 42);

var list = new List<Tuple<int, int>>();

请注意,如果您选择使用 Tuple<int, int> 的路线那么您将需要创建 IEqualityComparer<Tuple<TFirst, TSecond>> 的自定义实现反射(reflect)您的平等规则 (x, y)被认为等于 (y, x) .然后,您必须将此比较器的实例传递给 List<T>.Contains(T, IEqualityComparer<T>) (这里的 T 对您来说是 Tuple<int, int>)。

class TupleAsUnorderedPairComparer : IEqualityComparer<Tuple<TFirst, TSecond>> {
    public bool Equals(Tuple<TFirst, TSecond> x, Tuple<TFirst, TSecond> y) {
        if(Object.ReferenceEquals(x, y)) {
            return true;
        }
        if(x == null || y == null) {
            return false;
        }
        return x.Item1 == y.Item1 && x.Item2 == y.Item2 ||
               x.Item1 == y.Item2 && x.Item2 == y.Item1;
    }

    public int GetHashCode(Tuple<TFirst, TSecond> x) {
        if(x == null) {
            return 0;
        }
        return x.Item1.GetHashCode() ^ x.Item2.GetHashCode();
    }
}

否则,如果您不能或不想使用 Tuple那么你需要实现一个 IEqualityComparer<Pair>为你的 Pair类或覆盖 Object.EqualsObject.GetHashCode .

class Pair {
    public int First { get; private set; }
    public int Second { get; private set; }
    public Pair(int first, int second) {
        this.First = first;
        this.Second = second;
    }

    public override bool Equals(object obj) {
        if(Object.ReferenceEquals(this, obj)) {
            return true;
        }
        Pair instance = obj as Pair;
        if(instance == null) {
            return false;
        }
        return this.First == instance.First && this.Second == instance.Second ||
               this.First == instance.Second && this.Second == instance.First;
    }

    public override int GetHashCode() {
        return this.First.GetHashCode() ^ this.Second.GetHashCode();
    }
}

class PairEqualityComparer : IEqualityComparer<Pair> {
    // details elided 
}

如果你使用

list.Contains(pair);

然后它将使用EqualsGetHashCode但是如果你使用

list.Contains(pair, new PairEqualityComparer);

然后它将使用PairEqualityComparer.EqualsPairEqualityComparer.GetHashCode .请注意,这些可能与您对 Object.Equals 的实现不同和 Object.GetHashCode .

最后,如果您经常进行遏制测试,那么 List不是你最好的选择;您应该使用为此目的设计的类,例如 HashSet .

关于c# - 在列表中存储一对整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4354596/

相关文章:

c# - 带有日期参数的 Angular 6 服务调用

c# - 什么是 Visual Studio 的控制台应用程序命名约定?

android - 将元素添加到列表时出现 UnsupportedOperationException(无 Arrays.asList)

json - Flutter:将JSON文件的特定字段结合在一起,成为列表本身

c++ - 随机整数c++

python - 如何在 python 中对 32 位整数进行字节交换?

c# - C#中的并行迭代?

c# - 使用 errorprovider 验证多个文本框

python - 在 Python 列表中按值对字典中的键进行排序

Java:如何执行向-Infinity而不是0舍入的整数除法?