2013-07-18 9 views
9

mam tej klasyPotrzeba lepszego sposobu, aby podsumować dane

public class ConnectionResult 
{ 
    private int connectionPercentage; 

    public int ConnectPercentage 
    { 
    get { return connectionPercentage; } 
    } 

    public ConnectionResult(int ip) 
    { 
    // Check connection and set connectionPercentage 
    } 
} 

i mam menedżera, który dostaje kilka list ConnectionResult i liczyć każda wartość większa niż określonej liczbie ustalonej przez konfiguracji. moja implementacja jest tak:

public class CurrentConnections 
{ 
    private static CurrentConnections inst; 

    private CurrentConnections() 
    { 

    } 

    public static CurrentConnections GetInstance 
    { 
    get 
    { 
     if (inst != null) 
     { 
      inst = new CurrentConnections(); 
     } 
     return inst; 
    } 
    } 

    public int CountActiveConnections(params List<ConnectionResult>[] conns) 
    { 
    int rtVal = 0; 

    foreach (List<ConnectionResult> connectionResult in conns) 
    { 
     foreach (var currConn in connectionResult) 
     { 
      if (currConn.ConnectPercentage > ACCEPTABLE_CONNECTION) 
      { 
       rtVal++; 
      } 
     } 
    } 

    return rtVal; 
    } 
} 

ale chcę zrobić to lepiej, więc zacząłem pisać je w LINQ i mam do

conns.Count(x => x.Count(y => y.ConnectPercentage > ACCEPTABLE_CONNECTION)); 

ale to daje mi błąd Cannot implicitly convert type 'int' to 'bool'. czy istnieje sposób, aby to policzyć w linq lub czy muszę zostać z tym, co napisałem? Przy okazji, jestem nowy w Linq

Odpowiedz

7

John Skeet's answer jest doskonała, ale zająć się błąd, że jesteś widząc, zapytanie będzie:

conns.Sum(x => x.Count(y => y.ConnectPercentage > ACCEPTABLE_CONNECTION)); 
  • Count przyjmuje funkcję, która zwraca bool i zwraca liczbę elementów z kolekcji, które spełniają te kryteria.
  • Sum przyjmuje funkcję, która zwraca między innymi int i zwraca sumę wyników wyrażenia zastosowanego do każdego elementu.

Oczywiście, czy wybrać każdy element z każdego podzbioru a następnie policzyć je (jak John Skeet wskazuje), albo policzyć elementy z każdego podzbioru a następnie zsumować liczbę (jak mój kod sugeruje), wynik będzie dokładnie taki sam.

+0

Warto może co jeszcze wyraźniej, że będzie to rzeczywiście dać taki sam efekt ... –

+0

@JonSkeet Dodałem ten temat do wyjaśnienia. –

7

Dwa razy używasz Count i nie sądzę, że chcesz. Myślę, że po prostu chcesz:

return conns.SelectMany(list => list) 
      .Count(conn => conn.ConnectPercentage > ACCEPTABLE_CONNECTION); 

SelectMany wezwanie jest spłaszczyć „tablicę list” do pojedynczej sekwencji połączeń.

2
return conns.SelectMany(x=> x).Where(conn => conn.ConnectPercentage > ACCEPTABLE_CONNECTION).; 
+0

Proszę, uzasadnij swoją odpowiedź. Powiedz nam, co było nie tak i co dokładnie robisz. – yulian

Powiązane problemy