Alle Beispiele für SelectMany, die ich sehe, sind flattening Arrays von Arrays und so weiter. Ich habe einen anderen Blickwinkel auf diese Frage.
Ich habe ein Array eines Typs, und ich möchte den Inhalt dieses Typs in einen Stream extrahieren. Hier ist mein Beispielcode:
public class MyClass
{
class Foo
{
public int X, Y;
}
static IEnumerable<int> Flatten(Foo foo)
{
yield return foo.X;
yield return foo.Y;
}
public static void RunSnippet()
{
var foos = new List<Foo>()
{
new Foo() { X = 1, Y = 2 },
new Foo() { X = 2, Y = 4 },
new Foo() { X = 3, Y = 6 },
};
var query = foos.SelectMany(x => Flatten(x));
foreach (var x in query)
{
Console.WriteLine(x);
}
}
}
Diese Ergebnisse würde ich gerne sehen: 1, 2, 2, 4, 3, 6.
Kann ich die Erträge eliminieren? Ich weiß, dass die dafür erforderlichen Installationen nicht trivial sind und wahrscheinlich erhebliche Kosten verursachen. Ist es möglich, es alle in Linq zu tun?
Ich habe das Gefühl, dass ich der Antwort sehr nahe bin und mir nur noch das magische Schlüsselwort fehlt, nach dem ich suchen muss :)
UPDATE:
Wie in der Antwort weiter unten erwähnt, kann man etwas in der Art verwenden:
foos.SelectMany(x => new[] { x.X, x.Y });
Ich hatte jedoch gehofft, eine Möglichkeit zu finden, dies zu tun, ohne n/2 temporäre Arrays zu erzeugen. Ich lasse dies gegen eine große Auswahlmenge laufen.