C#‘da Birden Fazla Listede Ortak Öğeleri Bulmanın En Hızlı Yolu
C#‘da koleksiyonlarla çalışırken, sıklıkla birden fazla liste arasında ortak öğeleri bulmanız gereken durumlarla karşılaşabilirsiniz. Bu, belirli kriterlere dayalı sonuçları filtrelemek istediğinizde özellikle faydalıdır. Bu blog yazısında, ortak bir senaryoyu ele alacağız: bir liste içindeki her listede yer alan Option
nesnelerinin alt kümesini hızlı bir şekilde nasıl tanımlayabileceğinizi.
Problem Tanımı
Diyelim ki List<List<Option>> optionLists
şeklinde bir liste listesi yapılandırmanız var. Tüm N
listelerde hangi Option
nesnelerinin bulunduğunu belirlemeniz gerekiyor. Bunu çözerken, Option
nesnelerinin eşitliğinin option1.Value == option2.Value
gibi belirli bir string özelliğine dayandığını bilmemiz gerekiyor. Sonuç olarak, her öğenin yalnızca bir kez göründüğü bir List<Option>
döndürmek istiyoruz.
Çözüm: Ortak Opsiyonları Bulmak
Bu problemi çözmek için C#‘da LINQ (Language Integrated Query - Dil Entegre Sorgu) kullanabiliriz. LINQ, koleksiyonları sorgulamak için güçlü bir yol sunar ve bu kullanım durumumuz için idealdir. Aşağıda bu işi başaran etkili bir kod örneği bulunmaktadır:
var x = from list in optionLists
from option in list
where optionLists.All(l => l.Any(o => o.Value == option.Value))
orderby option.Value
select option;
Kodun Açıklaması
LINQ sorgusunu adım adım inceleyelim:
-
Dış From Koşulu: İlk kısım
from list in optionLists
ana liste olanoptionLists
‘teki her listeyi döngüye alır. -
İç From Koşulu: İkinci kısım
from option in list
mevcut listede herOption
‘a erişir. -
Where Koşulu: Bu, çözümün kritik kısmıdır:
where optionLists.All(l => l.Any(o => o.Value == option.Value))
koşulu, mevcutoption
‘ınoptionLists
içindeki tüm listelerde bulunup bulunmadığını kontrol eder.Any
metodu, mevcut listedeValue
özelliğinin mevcutoption
‘ınValue
değeriyle eşleştiği herhangi birOption o
olup olmadığını kontrol eder.
-
Sonuçların Sıralanması:
orderby option.Value
kısmı, sonuçta bulunanOption
nesneleriniValue
‘larına göre sıralar. -
Select Koşulu: Son olarak,
select option
tüm uygun seçenekleri bir koleksiyon haline getirir.
Önemli Noktalar
-
Farklı Değerler: Verilen kod, ayırt edici bir seçim içermemektedir; bu da aynı
Value
‘ya sahip birden fazlaOption
nesnesi döndürebileceği anlamına gelir. BenzersizOption
‘lar istiyorsanız, sorgunuza.Distinct()
eklemeyi düşünün. -
Performans: Listelerinizin boyutuna bağlı olarak, bu yaklaşımın verimliliği önemlidir. LINQ sorguları optimize edildiği için orta boyutlu veri setlerinde iyi performans gösterebilir.
Sonuç
C#‘da birden fazla liste arasında ortak öğeleri bulmak, örneğimizde gösterildiği gibi LINQ kullanılarak verimli bir şekilde gerçekleştirilebilir. LINQ’ın gücünden yararlanarak, minimal kodlama çabasıyla karmaşık sorgular gerçekleştirebiliriz. Bu, hem kodlama sürecinizi hızlandırır hem de kodunuzun okunabilirliğini ve sürdürülebilirliğini artırır.
Artık bu bilgiyle donanmış olarak, projelerinizde bu tür çözümleri kolaylıkla uygulayabilir ve koleksiyonlarınızı daha basit ve verimli bir şekilde yönetebilirsiniz.