Nie obchodzi mnie kolejność elementów.Co jest szybsze: Union czy Concat?
http://msdn.microsoft.com/en-us/library/system.linq.enumerable.union.aspx
http://msdn.microsoft.com/en-us/library/bb302894.aspx
Nie obchodzi mnie kolejność elementów.Co jest szybsze: Union czy Concat?
http://msdn.microsoft.com/en-us/library/system.linq.enumerable.union.aspx
http://msdn.microsoft.com/en-us/library/bb302894.aspx
Unia usuwa duplikaty. Concat nie.
Dają więc różne wyniki, jeśli źródła zawierają jakiekolwiek elementy wspólne lub mają wewnętrzne duplikaty.
Jeśli możesz zagwarantować, że nie ma duplikatów, lub jeśli jest ich niewiele i nie zależy Ci na ich umieszczeniu na wyjściu, Concat będzie szybszy, ponieważ nie ma potrzeby testowania każdej wartości w stosunku do tego, co już zostało uzyskane.
Jeśli jednak istnieje wiele duplikatów i nie są one potrzebne, dodatkowe przetwarzanie w Unii w celu usunięcia duplikatów może zostać zrównoważone przez oszczędności w kodzie, które pochłaniają wyniki.
Czy zależy Ci tylko na prędkości wykonania? Ile czasu zajmuje przetworzenie elementu, gdy go otrzymasz?
Concat
jest prostszy - nie musi wykonywać żadnego przetwarzania, ani buforować wyników, które już zostały zwrócone. Jednak spowoduje to więcej wyników, jeśli na skrzyżowaniu znajdują się jakieś elementy. Jeśli masz zamiar zająć dużo czasu, aby przetworzyć każdy wynik, Concat
może zakończyć się skutecznie jest wolniejszy.
W moim przypadku użyję Distinct() na końcu, co faworyzuje używanie Unii, jak sądzę. –
Jeśli korzystasz z Unii, to i tak nie musisz dzwonić do Distinct. –
Związek usuwa duplikaty między listami, ale jeśli pierwsza lista ma duplikaty w sobie, te nie zostaną usunięte przez związek. A więc - w zależności od okoliczności może być konieczne wywołanie Distinct. –
Co zostało powiedziane powyżej, jest słuszne. Oto trochę dodatek dla niektórych szczególnych przypadkach:
Jeśli trzeba złączyć na przykład dwie listy i jeśli potrzebujesz pełnej prędkości, należy rozważyć użycie wydajność. Oczywiście jest to o wiele mniej elastyczne i wygodne niż w połączeniu z Linq. Dlatego ma sens tylko w szczególnych przypadkach.
Ta nieruchomość na przykład zapewni takie same jak List1.Concat (lista2)
public IEnumerable<MyObject> AllObjects
{
get
{
foreach (MyObject o1 in List1)
yield return o1;
foreach (MyObject o2 in List2)
yield return o2;
}
}
'Concat' dokładnie robi to w sposób pokazany w przykładzie (patrz: [źródło] (https://referencesource.microsoft.com/#System.Core/System/Linq/ Enumerable.cs # 800)). Nie ma więc potrzeby implementowania go samemu. – scher
Spróbuj to w obie strony. Wyjdź ze stopera. Wtedy będziesz wiedzieć. Analiza "wydajności" oparta na * zgadywaniu * bez względu na to, jak jest wykształcona, nie jest właściwie użyteczna jako podstawa do podejmowania decyzji * inżynierskich *. –