LINQ Aggregatfunktionen für Bytes, Kurzschlüsse und vorzeichenlose Werte

8

Wie würden Sie LINQ-Aggregatfunktionen (z. B. Summe, Durchschnitt) für Sammlungen von Bytes, Kurzschlüssen und vorzeichenlosen Werten verwenden? Zugegeben, ich bin ein neuer C # -Programmierer, aber ich kann nicht einmal herausfinden, wie man etwas kompilieren kann, geschweige denn eine korrekte Ausgabe hat.

Hier ist ein triviales Beispiel für das, was ich versuche zu tun:

%Vor%

oder

%Vor%

Ich kann keine dieser Proben verwenden. Wenn ich den Datentyp in int ändere, funktioniert es, aber ich kann es nicht für Kurzschlüsse, Bytes, uintas usw. arbeiten.

Was mache ich falsch?

    
Jacob Snyder 13.06.2011, 18:53
quelle

4 Antworten

14

Enumerable.Sum<T>() ist nur für IEnumerable<T> und T in

definiert %Vor%

Dies liegt daran, dass es keinen Additionsoperator * für short oder einen anderen primitiven Typ gibt ( short + short ist zB int ).

Sie müssen sagen:

%Vor%

und weniger explizit können Sie mit

davonkommen %Vor%

In diesem Fall rufen Sie jetzt die Überladung auf:

%Vor%

* : Hier meine ich "operator" im Sinne einer Funktion F:(short x short) -> short .

    
jason 13.06.2011, 18:57
quelle
5

Enumerable.Sum akzeptiert entweder int s, long s, single s oder double s.

Sie können die Zahlen so umwandeln, dass sie als Parameter infrage kommen:

%Vor%

Alternativ können Sie ein Func<TSource, int> Lambda bereitstellen, das int auswählt. s für dich:

%Vor%

Ich erkläre sum als int weil es wirklich unsicher ist zu glauben, dass eine Summe von short s ein short selbst ist.
Es spiegelt sich sogar in der Tatsache wider, dass explizites Casting erforderlich ist beim Hinzufügen von short s:

%Vor%

Also Wenn Sie sicher sind, dass Sie nicht überlaufen werden, geben Sie einfach das Ergebnis ein :

%Vor%     
Dan Abramov 13.06.2011 18:58
quelle
2

Die Erweiterungsmethode Sum hat keine Überladung, die ein IEnumerable<short> erfordert.

Stattdessen können Sie einen Lambda-Ausdruck übergeben, der das short s implizit in int s konvertiert:

%Vor%     
SLaks 13.06.2011 18:58
quelle
0

Das verwirrte mich, aber ich konnte es wie folgt funktionieren lassen:

%Vor%     
Joe 13.06.2011 19:05
quelle

Tags und Links