2 Stimmen

LINQ/DataTable Gruppieren nach mehreren Kriterien und Maximalwert abrufen

Ich habe ein DataTable mit 8 Feldern. Ich möchte ein weiteres DataTable zurückgeben, das die ersten 7 Felder gruppieren und den maximalen Wert des 8. Feldes haben soll. Alle Felder sind Strings, das 8. ist eine Zahl, die in einem String-Feld gespeichert ist, z. B. "24".

Der bisher ausprobierte Code:

public DataTable highestVersion(DataTable dt)
        {
            DataTable dtResult = dt.Clone();

            var query = from dtRow in dt.AsEnumerable()
                        group dtRow by new
                        {
                            b_r = dtRow["r"],
                            b_1 = dtRow["b_1"],
                            b_2 = dtRow["b_2"],
                            p_r = dtRow["p_r"],
                            p_1 = dtRow["p_1"],
                            p_2 = dtRow["p_2"],
                            p_f = dtRow["p_f"]
                        }
                        into maxVersion
                        select maxVersion.OrderByDescending(a => a["p_v"]).First();

            foreach (var result in query)
            {
                dtResult.ImportRow(result);
            }
            return dtResult;
        }

Meine Erwartung ist, dass das group dtRow by new{} nach den ersten 7 Feldern gruppieren und nur das höchste Element p_v jeder Gruppierung erhalten sollte, indem OrderByDescending().First() aufgerufen wird. Aber das scheint tatsächlich nichts zu bewirken; alle Eingabereihen werden zurückgegeben.

BEARBEITEN: Mir ist gerade aufgefallen, wo das Problem liegt. Die Werte in p_f unterscheiden sich voneinander, z. B.

Datenreihe 1
--------
r: "abc"
b_1: "def"
b_2: "ghi"
p_r: "jkl"
p_1: "mno"
p_2: "pqr"
p_f: "stu_this"
p_v: "18"

Datenreihe 2
--------
r: "abc"
b_1: "def"
b_2: "ghi"
p_r: "jkl"
p_1: "mno"
p_2: "pqr"
p_f: "stu_that"
p_v: "24"

In diesem Fall möchte ich nur die Datenzeile 2 zurückgeben, weil 24>18 ist und den Wert stu_that abrufen können.

4voto

horgh Punkte 17039

Antwort aktualisiert in Reaktion auf Kommentare:

var res = dt.AsEnumerable()
            .GroupBy(dtRow => new
            {
                b_r = dtRow["r"],
                b_1 = dtRow["b_1"],
                b_2 = dtRow["b_2"],
                p_r = dtRow["p_r"],
                p_1 = dtRow["p_1"],
                p_2 = dtRow["p_2"]
            })
            .Select(g => new
            {
                Group = g,
                Max = g.Max(r => r["p_v"])
            })
            .Select(g => new
            {
                Key = g.Group.Key,
                Max = g.Max,
                Values = g.Group
                          .Where(r => r["p_v"].Equals(g.Max))
                          .Select(r => r["p_f"])
            });

Ich denke, es könnte bis zu einem gewissen Grad optimiert werden, aber zumindest sollte es seinen Zweck erfüllen, wenn alle Bedingungen jetzt bekannt sind, natürlich.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X