Dies ist eine bekannte Gefahr für Menschen, die sich mit LINQ die Füße nass machen:
public class Program
{
public static void Main()
{
IEnumerable<Record> originalCollection = GenerateRecords(new[] {"Jesse"});
var newCollection = new List<Record>(originalCollection);
Console.WriteLine(ContainTheSameSingleObject(originalCollection, newCollection));
}
private static IEnumerable<Record> GenerateRecords(string[] listOfNames)
{
return listOfNames.Select(x => new Record(Guid.NewGuid(), x));
}
private static bool ContainTheSameSingleObject(IEnumerable<Record>
originalCollection, List<Record> newCollection)
{
return originalCollection.Count() == 1 && newCollection.Count() == 1 &&
originalCollection.Single().Id == newCollection.Single().Id;
}
private class Record
{
public Guid Id { get; }
public string SomeValue { get; }
public Record(Guid id, string someValue)
{
Id = id;
SomeValue = someValue;
}
}
}
Dies gibt "False" aus, da für jeden Namen, der zum Erstellen der ursprünglichen Sammlung angegeben wird, die Auswahlfunktion immer wieder neu bewertet wird und das resultierende Record
Objekt neu erstellt wird. Um dies zu beheben, ToList
könnte am Ende von ein einfacher Aufruf an hinzugefügt werden GenerateRecords
.
Welchen Vorteil erhoffte sich Microsoft von dieser Implementierung?
Warum speichert die Implementierung die Ergebnisse nicht einfach in einem internen Array? Ein spezifischer Teil dessen, was passiert, ist möglicherweise eine verzögerte Ausführung, die jedoch auch ohne dieses Verhalten implementiert werden kann.
Welchen Vorteil hat es, wenn ein bestimmtes Mitglied einer von LINQ zurückgegebenen Sammlung nicht intern referenziert oder kopiert wird, sondern dasselbe Ergebnis als Standardverhalten neu berechnet wird?
In Situationen, in denen in der Logik ein bestimmtes Erfordernis für dasselbe Mitglied einer Sammlung besteht, das immer wieder neu berechnet wird, könnte dies anscheinend über einen optionalen Parameter angegeben werden, und das Standardverhalten könnte sich auch anders verhalten. Darüber hinaus verringert sich der Geschwindigkeitsvorteil, der durch die verzögerte Ausführung erzielt wird, letztendlich um die Zeit, die für die kontinuierliche Neuberechnung derselben Ergebnisse erforderlich ist. Letztendlich ist dies ein verwirrender Block für diejenigen, die neu in LINQ sind, und es könnte letztendlich zu subtilen Fehlern in jedem Programm kommen.
Welchen Vorteil hat dies, und warum hat Microsoft diese scheinbar sehr absichtliche Entscheidung getroffen?
return listOfNames.Select(x => new Record(Guid.NewGuid(), x)).ToList();
Das gibt Ihnen Ihre "zwischengespeicherte Kopie". Problem gelöst.