Sıralı bir dizi nesneler için LINQ komutlarını kullanın. Dizinin sırasının değişmediğinden emin olmak için hangi işlemleri yapmam gerekir?
Sıralı bir dizi nesneler için LINQ komutlarını kullanın. Dizinin sırasının değişmediğinden emin olmak için hangi işlemleri yapmam gerekir?
Yanıtlar:
System.Linq.Enumerable yöntemlerini inceledim ve IEnumerable olmayan sonuçları döndüren herhangi birini atarak. Sonuç sırasının kaynağın sırasından nasıl farklı olacağını belirlemek için her birinin açıklamalarını kontrol ettim.
Siparişi Kesinlikle Korur. Bir kaynak öğeyi bir sonuç öğesine dizine göre eşleyebilirsiniz
Düzeni Korur. Öğeler filtrelenir veya eklenir, ancak yeniden sipariş edilmez.
Siparişi Yok Eder - sonuçların ne olacağını beklemiyoruz.
Siparişi Açıkça Yeniden Tanımlar - sonucun sırasını değiştirmek için bunları kullanın
Düzeni bazı kurallara göre yeniden tanımlar.
Düzenleme: Bu uygulamaya dayalı Farklı Koruma siparişine taşındı .
private static IEnumerable<TSource> DistinctIterator<TSource>
(IEnumerable<TSource> source, IEqualityComparer<TSource> comparer)
{
Set<TSource> set = new Set<TSource>(comparer);
foreach (TSource element in source)
if (set.Add(element)) yield return element;
}
Distinct
yöntem için) "öngörülemeyen sırada" değil, "sıralanmamış" demekti. Distinct
Aynen yukarıdaki filtreleme kategorisine ait olduğunu söyleyebilirim Where
.
Aslında SQL'den mi yoksa dizilerden mi bahsediyorsunuz? Başka bir deyişle, LINQ to SQL veya LINQ to Objects kullanıyor musunuz?
LINQ to Objects operatörleri aslında orijinal veri kaynaklarını değiştirmez; veri kaynağı tarafından etkin bir şekilde desteklenen diziler oluştururlar. Sıralamayı değiştiren tek işlemler OrderBy / OrderByDescending / ThenBy / ThenByDescending şeklindedir - ve o zaman bile eşit olarak düzenlenmiş elemanlar için kararlıdır. Tabii ki, birçok işlem bazı öğeleri filtreleyecektir, ancak döndürülen öğeler aynı sırayla olacaktır.
Farklı bir veri yapısına dönüştürürseniz, örneğin ToLookup veya ToDictionary ile, siparişin bu noktada korunduğuna inanmıyorum - ama yine de biraz farklı. (Aynı anahtarla eşleştirilen değerlerin sırası, aramalar için korunur, ancak inanıyorum.)
GroupBy
sonra SelectMany
sonuçları anahtarla gruplandırılmış olarak verir, ancak artan anahtar düzeninde vermez ... onları anahtarların başlangıçta gerçekleştiği sırayla verecektir.
list<x> {a b c d e f g}
c, d, e'nin hepsi aynı anahtara sahipse, sonuçta ortaya çıkan dizi, c, d, e sırasıyla AND, yan yana AND, c, d, e içerecektir. Kategorik MS tabanlı bir cevap bulamıyorum.
Bir dizi üzerinde çalışıyorsanız, SQL yerine LINQ-to-Objects kullandığınız anlaşılıyor; onaylayabilir misin Çoğu LINQ işlemi hiçbir şeyi yeniden sıralamaz (çıktı girdiyle aynı sırada olur) - başka bir sıralama uygulamayın (OrderBy [Azalan] / ThenBy [Azalan]].
Jon daha açık bir şekilde ifade ettiği gibi; LINQ genellikle orijinal verileri yalnız bırakarak yeni bir dizi oluşturur ]
Verilerin bir Dictionary<,>
(ToDictionary) içine itilmesinin, sözlüğün belirli bir sıralama düzenine uymadığından verilerin karıştırılacağını unutmayın.
Ancak en yaygın olan şeyler (Seç, Nerede, Atla, Al) iyi olmalıdır.
ToDictionary()
sadece sipariş hakkında hiçbir söz vermez , ancak pratikte giriş emrini korur (siz ondan bir şey kaldırana kadar). Buna güvenmiyorum demiyorum, ama 'karıştırmak' yanlış görünüyor.
Benzer bir soruda resmi belgelere gönderme yapan harika bir cevap buldum. Alıntı yapmak için:
İçin Enumerable
yöntemleri (geçerli nesneleri için LINQ List<T>
) kullanarak, dönen elemanların sırasında güvenebilir Select
, Where
ya da GroupBy
. Bu doğası gereği gibi sırasız olan şeyler için durum böyle değildir ToDictionary
ya Distinct
.
Gönderen Enumerable.GroupBy belgelerinde:
IGrouping<TKey, TElement>
Nesneleri her birinci anahtar üretilen kaynak öğeleri sırasına göre bir düzen içinde elde edilmektedirIGrouping<TKey, TElement>
. Bir gruplamadaki öğeler göründükleri sıraya göre verilirsource
.
Bu, IQueryable
genişletme yöntemleri (diğer LINQ sağlayıcıları) için geçerli değildir .
Kaynak: LINQ'nun Numaralandırılabilir Yöntemleri, Elemanların Göreli Sırasını Koruyor mu?
Buradaki soru özellikle LINQ-to-Objects anlamına gelmektedir.
Eğer LINQ-to-SQL kullanıyorsan, bunun gibi bir şey empoze etmedikçe, orada herhangi bir sipariş yoktur:
mysqlresult.OrderBy(e=>e.SomeColumn)
Bunu LINQ-to-SQL ile yapmazsanız, sonuçların sırası, aynı verilerden sonra bile gelen sorgular arasında değişebilir ve bu da aralıklı bir hataya neden olabilir.