比较许多列表的大小(Count)

时间:2011-11-11 13:12:35

标签: c# list

我想知道我是否可以优雅而快速地比较许多列表的大小。

基本上这是我的问题,我需要声明6个列表具有相同的大小。所以通常的方式是(警告丑陋的代码..):

if (list1.Count == list2.Count && list1.Count == list3.Count && .....) {
    //ok, so here they have same size.
}

这里有一些绝地替代品?

5 个答案:

答案 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;