2013-07-18 8 views
9

Ich habe diese Klassebesseren Weg benötigen Daten zusammenzufassen

public class ConnectionResult 
{ 
    private int connectionPercentage; 

    public int ConnectPercentage 
    { 
    get { return connectionPercentage; } 
    } 

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

und ich habe einen Manager, der jeder Wert größer als eine bestimmte Anzahl bestimmt durch Konfiguration mehrere Listen von Connection und zählen wird. meine Implementierung ist so:

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

, aber ich will es besser machen, so begann ich es in Linq zu schreiben und ich habe zu

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

aber das gibt mir einen Fehler von Cannot implicitly convert type 'int' to 'bool'. gibt es eine Möglichkeit, es in linq zu zählen oder muss ich bei dem bleiben, was ich geschrieben habe? BTW, ich bin neu in Linq

Antwort

7

John Skeet's answer ausgezeichnet ist, aber den Fehler zu adressieren, die Sie sehen, würde die Abfrage sein:

conns.Sum(x => x.Count(y => y.ConnectPercentage > ACCEPTABLE_CONNECTION)); 
  • Count übernimmt eine Funktion, die bool und gibt die Anzahl der Elemente aus der Auflistung gibt die diese Kriterien erfüllen.
  • Sum akzeptiert eine Funktion, die (unter anderem) int zurückgibt und die Summe der Ergebnisse des auf jedes Element angewendeten Ausdrucks zurückgibt.

Natürlich ob Sie jedes Element aus jeder Untergruppe auswählen und dann zählen (wie John Skeet schon sagt), oder zählen Sie die Elemente aus jeder Teilmenge und dann die Zählungen summieren sich (wie mein Code schlägt), wird das Ergebnis genau das gleiche sein.

+0

Es kann sein, lohnt sich deutlicher noch, dass dies tatsächlich geben das gleiche Ergebnis ... –

+0

@JonSkeet Ich habe eine darüber hinzugefügt zu klären. –

7

Sie verwenden Count zweimal, und ich glaube nicht, dass Sie wollen. Ich glaube, Sie wollen einfach nur:

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

Der SelectMany Aufruf ist die „Array von Listen“ in eine einzige Folge von Verbindungen zu glätten.

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

Bitte begründen Sie Ihre Antwort. Sagen Sie uns, was falsch war und was genau Sie getan haben. – yulian

Verwandte Themen