2013-07-18 18 views
9

devo questa classeBisogno modo migliore per riassumere i dati

public class ConnectionResult 
{ 
    private int connectionPercentage; 

    public int ConnectPercentage 
    { 
    get { return connectionPercentage; } 
    } 

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

e ho un manager che ottiene diverse liste di ConnectionResult e contare ogni valore maggiore di un numero specifico determinato dalla configurazione. la mia implementazione è così:

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; 
    } 
} 

ma voglio renderlo migliore, così ho iniziato a scrivere in LINQ e ho avuto modo di

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

ma questo mi dà un errore di Cannot implicitly convert type 'int' to 'bool'. c'è un modo per contarlo in linq o devo stare con quello che ho scritto? btw, sono nuovo di linq

risposta

7

John Skeet's answer è eccellente, ma per affrontare l'errore che si sta vedendo, la query sarebbe:

conns.Sum(x => x.Count(y => y.ConnectPercentage > ACCEPTABLE_CONNECTION)); 
  • Count accetta una funzione che restituisce bool e restituisce il numero di elementi della collezione, che soddisfare tali criteri.
  • Sum accetta una funzione che restituisce int (tra gli altri) e restituisce la somma dei risultati dell'espressione applicata a ciascun elemento.

Naturalmente, se si seleziona ogni elemento da ogni sottoinsieme e poi contare fino (come John Skeet suggerisce), o si contano i lotti di ogni sottoinsieme e quindi aggiungere i conteggi (come il mio codice suggerisce), il risultato sarà esattamente lo stesso.

+0

Potrebbe valere la pena che lo rende ancora più chiaro che questo sarà effettivamente dare lo stesso risultato ... –

+0

@JonSkeet Ho una di quella di chiarire. –

7

Stai utilizzando Count due volte e non penso che tu voglia. Credo che si desidera solo:

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

La chiamata SelectMany è quello di appiattire la "matrice di liste" in una singola sequenza di connessioni.

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

Per favore, giustifica la tua risposta. Dicci cosa c'era che non andava e cosa esattamente hai fatto. – yulian

Problemi correlati