2011-11-11 6 views
9

Me preguntaba si puedo comparar el tamaño de muchas listas de una manera elegante y rápida.Comparar el tamaño (Cantidad) de muchas listas

Básicamente este es mi problema, debo afirmar que 6 listas tienen el mismo tamaño. Así que la forma habitual es algo así como (advertencia de código feo ...):

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

¿Algunas alternativas de Jedi aquí?

Respuesta

2

¿Qué tal con LINQ:

bool allSameSize = new[] { list1, list2, list3, list4, list5, list6 } 
         .Select(list => list.Count) 
         .Distinct() 
         .Take(2) // Optimization, not strictly necessary 
         .Count() == 1; 

Esta idea funciona para cualquier tipo de secuencia (no sólo las listas), y será rápida rechazar tan pronto como se encuentran dos cargos distintos.

En otra nota, ¿hay alguna razón para que las listas no sean parte de una colección de "listas de listas"?

+0

en lugar de 'Take (2) .Count() == 1' prefiero el' Saltee (1) .A ny() 'modismo – sehe

7

Usando Enumerable.All se puede comprobar que todas las listas coinciden con los mismos criterios:

var allLists = new[] { list1, list2, list3 }; 
bool result = allLists.All(l => l.Count == allLists[0].Count); 

o como una sola línea, pero lo haría continuación, tendrá que hacer referencia a una lista en particular:

bool result = (new[] { list1, list2, list3 }).All(l => l.Count == list1.Count); 
1
var lists = new [] { list1, list2, list3 ... }; 

bool diffLengths = lists.Select(list => list.Count).Distinct().Skip(1).Any(); 

O

bool sameLen = new HashSet<int>(lists.Select(list => list.Count)).Count <= 1; 
2

Si realiza este tipo de comparación en un solo lugar, entonces es probable que no vale la pena tratar de hacerla más corta (especialmente si su impacto en el rendimiento).

Sin embargo, si se comparan las longitudes de lista en más de un lugar, es tal vez valga la pena ponerlo en una función a continuación, volver a usarlo muchas veces:

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. 
    } 

} 

--- --- EDITAR

Basado en Dean Barnes' idea, incluso se podría hacer esto para la ejecución extra-corto:

static bool SameLength<T>(params IList<T>[] lists) { 
    return lists.All(list => list.Count == lists[0].Count); 
} 
Cuestiones relacionadas