Sie könnten wie etwas tun:
var result = myList.Concat(Enumerable.Repeat(default(int), 20)).Take(20);
Und es wäre leicht, dies in eine Erweiterungsmethode zu verwandeln:
public static IEnumerable<T> TakeOrDefault<T>(this IEnumerable<T> list, int count, T defaultValue)
{
return list.Concat(Enumerable.Repeat(defaultValue, count)).Take(count);
}
Aber gibt es hier eine subtile gotcha. Dies würde tadellos funktionieren für Werttypen, wenn Ihre defaultValue
nicht Null ist, fügen Sie das gleiche Objekt mehrere Male. Was wahrscheinlich nicht willst du willst. Zum Beispiel hatten, wenn Sie dies:
var result = myList.TakeOrDefault(20, new Foo());
Sie werden die gleiche Instanz von Foo
aufzufüllen Ihre Sammlung hinzuzufügen. Um dieses Problem zu lösen, würden Sie so etwas wie dieses benötigen:
public static IEnumerable<T> TakeOrDefault<T>(this IEnumerable<T> list, int count, Func<T> defaultFactory)
{
return list.Concat(Enumerable.Range(0, count).Select(i => defaultFactory())).Take(count);
}
Welche du so nennen würde:
var result = myList.TakeOrDefault(20,() => new Foo())
Natürlich können beide Verfahren nebeneinander existieren, so könnte man leicht haben :
// pad a list of ints with zeroes
var intResult = myIntList.TakeOrDefault(20, default(int));
// pad a list of objects with null
var objNullResult = myObjList.TakeOrDefault(20, (object)null);
// pad a list of Foo with new (separate) instances of Foo
var objPadNewResult = myFooList.TakeOrDefault(20,() => new Foo());
Warum nicht einfach eine Erweiterungsmethode schreiben, die die Anzahl überprüft und den Standardwert für die verbleibenden Einträge zurückgibt? –
@Jamiec Ist es falsch zu antworten, wenn jemand anderes bereits geantwortet hat? Ich bemerkte, dass es über Erweiterungsmethoden gemacht werden kann und setzte sich, um die Antwort zu rahmen. Es hat mich Zeit gekostet, aber ich werde posten, wenn ich etwas geschrieben habe –
@GaneshR. - Nein überhaupt nicht. Aber vielleicht möchtest du zurückkommen und deinen Kommentar danach löschen, sonst sieht es etwas seltsam aus * – Jamiec