列表始终不包含数组

时间:2015-02-23 12:57:55

标签: c# arrays list contain

我正在尝试检查数组列表是否包含反向顺序的数组,如果没有,请添加它们:

var faclist = new List<int[]>();
var factors = new int[2] {i, j};
if (!faclist.Contains(factors.Reverse()))
{
     faclist.Add(factors);
}

然而,即使存在具有相反因素的数组,此代码也始终不正确。

2 个答案:

答案 0 :(得分:5)

.Contains适用于.Equals方法。默认情况下,.Equals方法仅返回true,如果两个实例(引用)相同。

解决这个问题的一种可能方法 - 如果因素的数量是固定的 - 使用Tuple<int,int>。您可以使用:

在`Tuple类上定义Reverse方法
public static class Foo {

    public static Tuple<T2,T1> Reverse<T1,T2> (this Tuple<T1,T2> tuple) {
        return new Tuple<T2,T1>(tuple.Item2,tuple.Item1);
    }

}

然后简单地用:

来调用它
Tuple<int,int> t = new Tuple<int,int>(3,5);
Tuple<int,int> t2 = t.Reverse();

如果没有,您可以定义一个包装器类,它按照here所述执行相等性检查。

或另一种选择,就是按@xanatos answer所描述的.Contains方法自行提供相等检查器。

<强>演示:

$ csharp
Mono C# Shell, type "help;" for help

Enter statements below.
csharp> var t1 = new Tuple<int,int>(3,2);
csharp> var t2 = new Tuple<int,int>(3,2); 
csharp> t1.Equals(t2);
true
csharp> int[] t1 = new int[] {3,2};
csharp> int[] t2 = new int[] {3,2}; 
csharp> t1.Equals(t2);
false

答案 1 :(得分:3)

由CommuSoft撰写,因为数组不会以你的想法实现比较(他们只参考比较)

另一种解决方案是实现相等比较器:

public class IntArrayComparison : IEqualityComparer<int[]> {
    public bool Equals(int[] x, int[] y) {
        if (x == null) {
            return y == null;
        }

        if (y == null) {
            return false;
        }

        return x.SequenceEqual(y);
    }

    public int GetHashCode(int[] obj) {
        throw new NotImplementedException();
    }
}

if (!faclist.Contains(factors.Reverse().ToArray(), new IntArrayComparison())) {

然后在Contains方法中使用它。 (请注意,我必须将Reverse()的结果更改回数组,因为Reverse()会返回IEnumerable<T>