我想知道我是否可以优雅而快速地比较许多列表的大小。
基本上这是我的问题,我需要声明6个列表具有相同的大小。所以通常的方式是(警告丑陋的代码..):
if (list1.Count == list2.Count && list1.Count == list3.Count && .....) {
//ok, so here they have same size.
}
这里有一些绝地替代品?
答案 0 :(得分:9)
all()方法应该可以解决问题: http://msdn.microsoft.com/en-us/library/bb548541.aspx
我认为代码应该是这样的:
(new[] {list1, list2, list3, list4, list5, list6}).
All(list => list.Count == list1.Count);
答案 1 :(得分:7)
使用Enumerable.All
,您可以检查所有列表是否符合相同的条件:
var allLists = new[] { list1, list2, list3 };
bool result = allLists.All(l => l.Count == allLists[0].Count);
或者作为一个单行,但您需要参考特定列表:
bool result = (new[] { list1, list2, list3 }).All(l => l.Count == list1.Count);
答案 2 :(得分:2)
LINQ怎么样:
bool allSameSize = new[] { list1, list2, list3, list4, list5, list6 }
.Select(list => list.Count)
.Distinct()
.Take(2) // Optimization, not strictly necessary
.Count() == 1;
这个想法适用于任何类型的序列(不仅仅是列表),并且只要找到两个不同的计数就会快速拒绝。
另一方面,有没有理由说这些清单不属于“清单列表”集合?
答案 3 :(得分:2)
如果你只在一个地方进行这种比较,那么可能不值得尝试缩短它(特别是如果它会影响性能)。
但是,如果你在多个地方比较列表长度,也许值得将它放在一个函数中然后重复使用多次:
static bool SameLength<T>(params IList<T>[] lists) {
int len = -1;
foreach (var list in lists) {
int list_len = list.Count;
if (len >= 0 && len != list_len)
return false;
len = list_len;
}
return true;
}
static void Main(string[] args) {
// All of these lists have same length (2):
var list1 = new List<int> { 1, 2 };
var list2 = new List<int> { 3, 4 };
var list3 = new List<int> { 5, 6 };
var list4 = new List<int> { 7, 8 };
var list5 = new List<int> { 9, 10 };
var list6 = new List<int> { 11, 12 };
if (SameLength(list1, list2, list3, list4, list5, list6)) {
// Executed.
}
// But this one is different (length 3):
var list7 = new List<int> { 11, 22, 33 };
if (SameLength(list1, list2, list3, list7, list4, list5, list6)) {
// Not executed.
}
}
---编辑---
基于Dean Barnes' idea,您甚至可以执行此操作以实现超短暂的实施:
static bool SameLength<T>(params IList<T>[] lists) {
return lists.All(list => list.Count == lists[0].Count);
}
答案 4 :(得分:1)
var lists = new [] { list1, list2, list3 ... };
bool diffLengths = lists.Select(list => list.Count).Distinct().Skip(1).Any();
或者
bool sameLen = new HashSet<int>(lists.Select(list => list.Count)).Count <= 1;