Quindi dire che ho uno studente di classe con una proprietà, int Age
. Ora se ho List<Student> students
, come posso controllare se l'età di tutti gli studenti nella lista è uguale?come verificare se il valore della proprietà di ogni membro della lista è lo stesso
risposta
È possibile controllare utilizzando All
metodo, presumibilmente la vostra lista sono allievi:
var firstStudent = students.First();
students.All(s => s.Age == firstStudent.Age);
Probabilmente sarebbe meglio sollevare prima il 'First', anche se –
La tua prima implementazione non è stata così male perché enumerare fino a quando il primo elemento non è costoso. –
@MarcGravell: hai ragione, modificato –
Se si vuole fare questo in una query, non due (che è generalmente una cattiva pratica),
bool allAgesAreTheSame = (students.Select(s => s.Age).Distinct().Count() < 2);
lo farà per voi.
Questo restituirà anche true nel caso banale in cui non ci sono studenti, piuttosto che lanciare un'eccezione. (Si potrebbe fare == 1
piuttosto che < 2
per restituire false nel caso banale, invece.)
Un pensiero interessante: puoi aggiungere un 'Take (2)' tra 'Distinct()' e il 'Conteggio() ', che consentirebbe un livello di cortocircuito - tuttavia, avrebbe il sovraccarico di un iteratore aggiuntivo - quindi se questa è una buona cosa dipende dal fatto che un gran numero di età diverse sarebbe uno scenario probabile –
@ Marc, buon punto, sono abbastanza deluso da me stesso nell'usare un "conteggio" quando in realtà voglio solo un "0", 1 o 2 "", di solito sono abbastanza bravo a individuare quella roba. – Rawling
Questo wer iterate tutte le età anche se i primi due sono diversi. –
Basta una risposta a caso - non sono sicuro che farei in questo modo in realtà, ma questo sarà brutalmente efficace:
- userà iteratori digitati se anatra tipizzazione è disponibile (a differenza di LINQ che non sarà) - e si noti che
List<T>
fa offrono anatra tipizzato iteratori - nessun doppio-iterazioni
- fallimenti ecc per le sequenze vuote
- non delegati, cattura-contesti, ecc
- ecc
Codice:
using(var iter = students.GetEnumerator()) // a List<T>.Enumerator struct
{
if(!iter.MoveNext()) return true; // or false, as you define for "empty"
int age = iter.Current.Age;
while(iter.MoveNext())
if(iter.Current.Age != age)
return false;
return true;
}
+1 per "brutalmente efficiente". – Rawling
@Rawling Sono così vecchio stile: p –
Se non è possibile utilizzare LINQ, si può sempre ad anello tutti gli studenti:
private bool sameAge (List<Student> students)
{
int auxAge = students.Count > 0? students[0].Age : 0;
foreach (Student stu in students)
{
if (stu.Age != auxAge)
return false;
}
return true;
}
Se gli studenti possono avere 0 elementi si può fare questo:
var firstStudent = students.FirstOrDefault();
var areSame =students.All(s => s.Age == firstStudent.Age);
@Rawling Ho provato la soluzione e ha fatto ** non ** un'eccezione perché se ci sono 0 elementi, il metodo All() restituirà true senza tentare di eseguire il predicato lambda! –
... Ottimo punto, ora non mi sento stupido :) – Rawling
Se è sufficiente controllare questa volta, la risposta migliore è la soluzione migliore. Per usarlo più volte nel codice basta scrivere un'estensione statica per controllare l'uguaglianza della proprietà:
public static bool GetIdenticProperty<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> predicate)
{
IEnumerable<TSource> enumerable = source as IList<TSource> ?? source.ToList();
if ((!enumerable.Any()) || (enumerable.Count() == 1))
return true; // or false if you prefere
var firstItem = enumerable.First();
bool allSame = enumerable.All(i => Equals(predicate(i), predicate(firstItem)));
return allSame;
}
Se si desidera utilizzare il valore della proprietà in seguito permette di restituire tale valore:
public static TKey GetIdenticProperty<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> predicate)
{
IEnumerable<TSource> enumerable = source as IList<TSource> ?? source.ToList();
if (!enumerable.Any())
return default(TKey);
var firstItem = enumerable.First();
bool allSame = enumerable.All(i => Equals(predicate(i), predicate(firstItem)));
return allSame ? predicate(firstItem) : default(TKey);
}
Ma usando questo codice devi controllare che il valore restituito sia null
o default(TKey)
relativo al tipo di proprietà.
- 1. Come verificare se il valore è nella lista
- 2. Come ottenere il valore della proprietà bean quando il nome proprietà stesso è una variabile dinamica
- 3. Come posso verificare se è lo stesso utente in ASP.NET?
- 4. Moq - Come verificare che un valore della proprietà è impostato tramite il setter
- 5. Creare una proprietà python con lo stesso nome del membro della classe
- 6. Come verificare se il valore della variabile nello script AWK è nullo o vuoto?
- 7. Blocca solo se il valore è lo stesso?
- 8. Java ottiene il valore della proprietà per nome della proprietà
- 9. Perché il valore di un puntatore-membro è sempre lo stesso per i diversi membri della stessa struttura?
- 10. Verificare se il valore della colonna per tutte le righe è esattamente il valore
- 11. DataGridView & BindingList: come verificare se il valore della cella è cambiato?
- 12. Come verificare se il nome della classe è valido?
- 13. Qual è lo scopo della lista <?> se si può inserire solo un valore nullo?
- 14. Verificare se il valore intero è aumentato?
- 15. Sovrascrive il file delle proprietà se è presente il valore della riga di comando
- 16. Verificare se il valore esiste già nella lista dei dizionari?
- 17. Come verificare se due chiavi in dict mantengono lo stesso valore
- 18. Verificare se una lista di stringhe contiene un valore
- 19. automapper - ignora il mapping se il tipo di proprietà è diverso con lo stesso nome di proprietà - C#
- 20. Verificare se il risultato della chiamata non è definito
- 21. Applicare lo stile in base al valore della proprietà
- 22. Come verificare lo stato della migrazione?
- 23. Inserisci immagine dopo ogni elemento della lista
- 24. Sharepoint: verificare se un utente è membro di un gruppo
- 25. Sostituzione ogni 2 ° elemento della lista
- 26. come verificare se Lista <T> elemento contiene un elemento con un valore particolare proprietà
- 27. Excel: verificare se il valore della cella esiste nella colonna e quindi ottenere il valore della cella NEXT
- 28. Verificare se due hash hanno lo stesso set di chiavi
- 29. Qual è lo scopo principale della proprietà List.single?
- 30. CSS: utilizzare il contatore() numero come valore della proprietà
Vedere http://stackoverflow.com/questions/5478681/using-linq-can-i-verify-a-property-has-the-same-value-for-all-objects – goodeye