Compruebe si todos los elementos de la lista tienen el mismo valor de miembro en C #

Estoy buscando una forma simple y rápida de verificar si todos mis Listitems tienen el mismo valor para un miembro.

foreach (Item item in MyList) { Item.MyMember = ; } 

EDITAR: Olvidé una cosa: si uno de estos miembros (es una cadena) es String.Empty y todos los demás elementos tienen la misma cadena, ¡también debería ser cierto! Lo siento, olvidé esto.

EDIT: Bueno, después de que el nuevo requisito tiene

 bool allSame = !MyList.Select(item => item.MyMember) .Where(x => !string.IsNullOrEmpty(x)) .Distinct() .Skip(1) .Any(); 

Eso evita que tenga que dar un primer paso para encontrar un valor de muestra para empezar. (Y seguirá saliendo tan pronto como encuentre el segundo valor, por supuesto).

También solo itera una vez sobre la secuencia, lo que puede ser importante si no es realmente una secuencia repetible. No hay problema si se trata de una List por supuesto.

EDITAR: Para disipar las preocupaciones sobre Skip , de la documentación:

Si la fuente contiene menos elementos de conteo , se IEnumerable un IEnumerable vacío. Si el recuento es menor o igual a cero, se producen todos los elementos de la fuente .

Tu propia solución ya es bastante simple, pero si quisieras abstraer el bucle y escribirlo más expresivamente, podrías usar Linq.

 bool allSame = MyList.All(item => item.MyMember == someValue); 
 using System.Linq; … if (myList.Any()) // we need to distinguish between empty and non-empty lists { var value = myList.First().MyMember; return myList.All(item => item.MyMember == value); } else { return true; // or false, if that is more appropriate for an empty list } 

Estoy haciendo así:

 Item item = MyList.FirstOrDefault(x=>x.MyMember != valueToMatch); bool allMembersSame = item == null; 

Aquí hay un genérico que funciona para todas las versiones de .NET a partir de 2.0:

 public static bool AllSameByProperty(IEnumerable items, Converter converter) { TProperty value = default(TProperty); bool first = true; foreach (TItem item in items) { if (first) { value = converter.Invoke(item); first = false; continue; } TProperty newValue = converter.Invoke(item); if(value == null) { if(newValue != null) { return false; } continue; } if (!value.Equals(newValue)) { return false; } } return true; } 

Su uso en C # 2.0:

 AllSameByProperty(list, delegate(MyType t) { return t.MyProperty; }); 

Su uso en C # 3.0:

 AllSameByProperty(list, t => t.MyProperty);