2012-06-11 11 views
5
public class Product 
{ 
public string Name {set; get;} 
public string Type {set; get;} 
} 

public class ProductType 
{ 
public string Name{get;set} 
} 


var products = GetProducts(); 
var productTypes = GetProductTypes(); 

bool isValid = products.All(x=>x.Type == ??) // Help required 

Chcę się upewnić, że wszystkie produkty w "produktach" należą tylko do danego rodzaju produktu.Jak sprawdzić, czy wszystkie elementy należą do tego samego typu, używając LINQ

Jak można to osiągnąć w linq. Każda pomoc jest doceniana Jestem uderzony rzeczami LINQ? Dzięki.

+1

masz na myśli wszystkie produkty tego samego typu? –

+0

@ RaphaëlAlthaus Tak, masz rację – Lamps

Odpowiedz

9

Można sprawdzić, czy wszystkie elementy mają ten sam typ jako pierwszy element:

bool isValid = products.All(x => x.Type == products.First().Type); 
+0

Dzięki dtb za pomoc. – Lamps

+3

@Lampy Należy zauważyć, że ma niepotrzebne koszty wydajności, ponieważ za każdym razem, gdy anonimowa metoda wywoła, należy wykonać 'First()'. Proszę, sprawdź moją odpowiedź na lepsze rozwiązanie. –

+0

@JeffreyZhao dziękuję, Joey już wskazał, że zamierzam popchnąć Products.First() wywołać stronę. – Lamps

11

można użyć odrębne i Count:

isValid = products.Select(x => x.Type).Distinct().Count() == 1; 
+0

+1 Dziękuję Joey za pomoc, ale wolę odpowiedź dtb. – Lamps

+0

To jest w porządku. Chociaż zastanawiałem się, jak często tworzony jest nowy moduł wyliczający z powodu użycia 'products.First()' w swoim kodzie. Może to być raz na produkt "products". Ale nie mogę teraz przetestować. – Joey

+0

Ach, dzięki, joey za wskazanie tego, może mogę wypchnąć wywołanie First() na zewnątrz i zapisać wartość w zmiennej lokalnej? – Lamps

6
var isValid = products.Select(p => p.Type).Distinct().Count() == 1; 

lub

var first = products.FirstOrDefault(); 
var isValid == (first == null) ? true : products.All(p => p.Type == first.Type); 
+0

@KevinBrock Masz rację, naprawiłem kod. –

0

Jeśli chcesz tylko sprawdzić typ każdego e lement w LINQ następnie -

class A{ 
} 

class B{ 
} 

static void Main(string[] args) 
{ 
     ArrayList arr = new ArrayList(); 
     arr.Add(new A()); 
     arr.Add(new A()); 
     arr.Add(new A()); 
     arr.Add(new B()); 
     arr.Add(new A()); 
     int count= arr.ToArray().Count(x=> !x.GetType().Equals(typeof(A))); 
} 

powyższym przykładzie sprawdza typ każdego elementu w tablicy następnie pobiera liczbę elementów z tablicy, które nie są typu klasy A.

Mam nadzieję, że ten sam scenariusz i mam nadzieję że to pomoże !!

Powiązane problemy