在以下代码段::
中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'。 那么检查这个的方法是什么。我的意思是输出将如何变为'真'
答案 0 :(得分:3)
如果订单无关紧要,您可以使用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));
答案 1 :(得分:3)
如果您不关心列表中的重复条目,可以使用:
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))
答案 2 :(得分:1)
使用All
linq语句
var result = bigList.Where(x => x.All(y => subList.Contains(y)));
答案 3 :(得分:1)
您可以使用SequenceEqual
方法查看Any
:
bigList.Any(x => x.SequenceEqual(subList))
答案 4 :(得分:1)
您的代码返回“false”的原因是因为您正在测试bigList是否包含subList。它没有! BigList包含一个与subList相同但不是子列表的列表。
答案 5 :(得分:0)
尝试使用SequenceEqual
和Any
:
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>());
答案 6 :(得分:0)
试试这个
bigList.Add(子表);
完整代码
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