如何检查具有相同值的列表是否存在

本文关键字:列表 存在 是否 何检查 检查 | 更新日期: 2023-09-27 18:23:57

在以下代码段中::

static void Main(string[] args)
{
   List<List<int>> bigList = new List<List<int>> { };
   bigList.Add(new List<int> { 1, 2 });
   bigList.Add(new List<int> { 2, 3 });
   bigList.Add(new List<int> { 3, 4 });
   List<int> subList = new List<int> { 1, 2 };    
   Console.WriteLine(bigList.Contains(subList));
}

输出为::"False"。那么检查这个的方法是什么呢。我的意思是,输出将如何变成"True"

如何检查具有相同值的列表是否存在

如果您不关心列表中的重复条目,可以使用:

bigList.Any(b => new HashSet<int>(b).SetEquals(subList))

如果你想让两个列表都包含完全相同的元素,你可以使用这个:

bigList.Any(b => b.OrderBy(x => x).SequenceEqual(subList.OrderBy(x => x)))

如果你想让两个列表都有相同的元素,你可以使用这个:

bigList.Any(x => x.SequenceEqual(subList))

如果订单无关紧要,可以使用Any+All:

bool anyContains = bigList
    .Any(l => bigList.Count == l.Count && l.All(i => subList.Contains(i)));

否则,您可以使用Any+SequenceEqual

bool anySequencequals = bigList.Any(l => l.SequenceEqual(subList));

使用All linq语句

var result = bigList.Where(x => x.All(y => subList.Contains(y)));

您可以使用SequenceEqual方法与Any:进行检查

bigList.Any(x => x.SequenceEqual(subList))

您的代码返回"false"的原因是因为您正在测试bigList是否包含subList。事实并非如此!BigList包含一个看起来与subList相同但不是the subList的列表。

试试这个

bigList.Add(subList);

完整代码

        List<List<int>> bigList = new List<List<int>> { };
        List<int> subList = new List<int> { 1, 2 };
        bigList.Add(subList); //<<<<<<<<<< Here goes  Now bigList   contains subList    
        bigList.Add(new List<int> { 2, 3 });
        bigList.Add(new List<int> { 3, 4 });
        Console.WriteLine(bigList.Contains(subList));// true

尝试使用SequenceEqualAny:

bigList.Any(c => c.SequenceEqual(subList));

或者,如果您想以另一种方式使用Contains,您需要制作一个自定义的EqualityComparer:

public class CollectionEqualityComparer<T> : IEqualityComparer<IEnumerable<T>>
{
    public Equals(IEnumerable<T> x, IEnumerable<T> y) 
    { 
        return x.SequenceEqual(y); 
    }
    public GetHashCode(IEnumerable<T> obj) 
    {
        unchecked
        {
            return obj.Select(x => x.GetHashCode())
                      .Aggregate(17, (a, b) => a * 31 * b);
        }
    }
}

然后像这样使用Contains

bigList.Contains(sublist, new CollectionEqualityComparer<int>());