Jeśli wszystkie elementy na liście mają tę samą wartość, muszę użyć tej wartości, w przeciwnym razie muszę użyć „otherValue”. Nie mogę wymyślić prostego i jasnego sposobu na zrobienie tego.
Zobacz także Zgrabny sposób pisania pętli, która ma specjalną logikę dla pierwszego elementu w kolekcji.
Odpowiedzi:
Najczystszy sposób, jaki przychodzi mi do głowy. Możesz uczynić go jednowierszowym przez wbudowanie wartości val, ale metoda First () byłaby oceniana n razy, podwajając czas wykonania.
Aby uwzględnić zachowanie „pustego zestawu” określone w komentarzach, wystarczy dodać jeszcze jedną linię przed dwoma powyższymi:
źródło
.Any
pozwoliłoby na wcześniejsze zakończenie wyliczania w przypadkach, w których istnieją różne wartości?All
zakończy działanie, gdy tylko trafi w elementx
sekwencji, dla któregox.Value != val
. PodobnieAny(x => x.Value != val)
zakończy się, gdy tylko trafi w elementx
sekwencji, dla któregox.Value != val
. Oznacza to, że obaAll
iAny
wykazują „zwarcie” analogiczne do&&
i||
(co jest w rzeczywistości tym, czymAll
iAny
są).return yyy.Skip(1).All(x=>x.Value == val) ? val : otherValue;
Dobry szybki test dla wszystkich równych:
źródło
Class
, chociaż powinno działać ze strukturami. Świetnie nadaje się jednak do listy prymitywów.collection.Distinct().Count() <= 1
jeśli chcesz zezwolić na puste kolekcje..Distinct()
nie zawsze działa zgodnie z oczekiwaniami - szczególnie podczas pracy z obiektami zobacz to pytanie. W takich przypadkach musisz zaimplementować interfejs IEquatable.Distinct
ogóle nie przejdzie przez kolekcję iCount
wykona jedno przejście przezDistinct
iterator.Chociaż z pewnością można zbudować takie urządzenie z istniejących operatorów sekwencji, w tym przypadku byłbym skłonny napisać to jako niestandardowy operator sekwencji. Coś jak:
To dość jasne, krótkie, obejmuje wszystkie przypadki i nie tworzy niepotrzebnie dodatkowych iteracji sekwencji.
Przekształcenie tego w ogólną metodę, nad którą działa,
IEnumerable<T>
pozostaje jako ćwiczenie. :-)źródło
other
kiedynull
faktycznie (przypuszczalnie) była to poprawna odpowiedź. Powiedzmy, że funkcja byłaT Unanimous<U, T>(this IEnumerable<U> sequence, T other)
lub jakaś taka sygnatura, to trochę ją komplikuje.Lub jeśli martwisz się wykonywaniem First () dla każdego elementu (co może być ważnym problemem wydajności):
źródło
To może być późno, ale rozszerzenie, które działa zarówno w przypadku typów wartości, jak i typów referencyjnych w oparciu o odpowiedź Erica:
źródło
źródło
Alternatywa dla korzystania z LINQ:
Zauważyłem, że używanie
HashSet<T>
jest szybsze w przypadku list do ~ 6000 liczb całkowitych w porównaniu z:źródło
HashSet<T>
jest to początkowo szybsze niż użycie instrukcji LINQ w mojej odpowiedzi. Jeśli jednak zrobię to w pętli, LINQ jest szybszy.GetHashCode()
, co jest trudne do zrobienia poprawnie Patrz: stackoverflow.com/a/371348/2607840 więcej szczegółów.Niewielkie odstępstwo od powyższego uproszczonego podejścia.
var result = yyy.Distinct().Count() == yyy.Count();
źródło
Jeśli tablica jest typu wielowymiarowego, jak poniżej, musimy napisać poniżej linq, aby sprawdzić dane.
przykład: tutaj elementy mają wartość 0 i sprawdzam, czy wszystkie wartości są równe 0 lub nie.
ip1 =
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
źródło