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.