LINQ hangi sorun alanı için yapılmıştır?


12

C # 'da Yığın Taşması'nda yayınlanan bir soru gördüğümde, LINQ ile ilgili bir sorunu çözen en az bir veya iki cevap gönderildiğini görüyorum. Genellikle çok yüksek itibara sahip insanlar LINQ'yu profesyoneller gibi kullanıyor gibi görünüyor.

Benim sorum şu : LINQ'nun hangi problem alanı için kullanılması gerekiyor?

Ayrıca yan notlarda: Kaçınılması gereken herhangi bir amaç var mı? Veri kümesinin boyutu LINQ sorgularının performansını etkiler mi?




1
LINQ, nesne grafiklerini sorgulamak içindir. Dil Entegre Sorgulama - koleksiyonları sorgulamanızı ve değiştirmenizi sağlar.
Oded

1
standları olarak muhtemelen kapatılabilir bir soru orada hangi problem linq olsa için iyi bir uyum olduğunu iyi bir soru olabilir
jk.

1
Linq açıklayıcıdır. "Nasıl" yapıldığını belirtmeden "ne" istediğinizi belirtirsiniz. Linq için bu, ne istediğinizi belirtmek için bir sorgu kullanabileceğiniz anlamına gelir. Bazı sorunların bildirim kodu daha kısa ve anlaşılması kolay olabilir.
mike30

Yanıtlar:


16

LINQ temel olarak veri dizileri üzerinde saf işlevsel sorgulara ve dönüşümlere izin vermek için tasarlanmıştır (tüm LINQ uzantılarının Eylem delegelerini değil Func delegelerini aldığını göreceksiniz). Sonuç olarak, LINQ ile çok iyi uymayan bir döngünün en yaygın örneği, tamamen saf olmayan fonksiyonel yan etkilerle ilgili olan örn.

foreach(var x in list) Console.WriteLine(x);

LINQ kullanımında daha iyi olmak için, bunu kullanmayı deneyin.

Bir koleksiyonla bir şey yapmak için bir forveya foreachdöngü yazmak üzereyken, durun, LINQ için uygun olup olmadığını düşünün (yani sadece öğeler üzerinde bir eylem / yan etki gerçekleştirmiyor) ve eğer öyleyse kendinizi yazmaya zorlayın LINQ kullanarak.

Önce foreachsürümü yazıp ardından LINQ sürümüne yeniden yazabilirsiniz.

Svick'in işaret ettiği gibi, LINQ programınızı daha okunabilir hale getirmekle ilgili olmalıdır. Mekanizmadan ziyade kodun amacını vurgulama eğiliminde olduğu için genellikle bu iyidir; ancak, sorgularınızı basit bir döngüden daha okunabilir hale getiremezseniz, döngüye sadık kalın.

Pratik yapmak için alıştırmalara ihtiyacınız varsa, çoğu fonksiyonel programlama alıştırması LINQ ile iyi eşleşecektir, örneğin 99 problem (özellikle ilk 20 ya da öylesine) veya proje euler .


Bu soruyu şimdi silmem gerekebilir. Moderatör topluluk için uygun olmadığını söyledi .. Aksi takdirde, lütfen bana söyle.
user1816120

1
LINQ içine yeniden yazdıysanız ve orijinal hala daha okunabilir ise, orijinali koruyun ve LINQ sürümünü kaldırın. Bazen, LINQ hiçbir şey eklemez.
svick

@svick teoride evet, bunun herhangi bir örneğini düşünebileceğimden emin değilim;)
jk.

1
@jk. Örneğin, ReSharper bazen döngümü kullanarak LINQ dönüştürmeyi önerir Aggregate(). Sanırım çoğu zaman döngü daha okunabilir.
svick

@svick muhtemelen alışık olduğunuz şeyle ilgili bir sorun olsa da, toplamın fold
jk

1

Düzenlenen soruyu cevaplamak için: Kısacası, "sorgu" işlevselliğini (LINQ'daki Q'nun anlamı budur) uygulamak zorunda kaldığınızda LINQ kullanmak yararlıdır. Tam bir alan tanımlamak zordur, ancak koleksiyonlardan veri ayıklamak ve değiştirmekle ilişkili çeşitli görevleri büyük ölçüde basitleştirir.

Hafifçe detaylandırmak için, doğrudan dile (veya daha ziyade çeşitli LINQ uygulayıcılarına) çok sayıda sorgu işlevselliği getirildi, böylece toplamalar, sıralama, gruplama, filtreleme, projeksiyonlar, birleşimler (ve daha fazlası) sen. LINQ tabanlı çözümler de tipik olarak bunları "elle" uygulamanızdan ve aynı zamanda niyetlerini çok daha iyi iletmekten çok daha kısadır.

LINQ'nun gücünü aktarmaya yardımcı olan basit bir örnek, bir dizinin içeriğini uzantıya göre gruplandırılmış olarak görüntülemektir. Kafanızda tipik bir zorunlu uygulamadan geçin - başlangıçta çok sayıda uygulama ayrıntısı olacaktır. Belki de Dictionary<String, List<String>>dosyaları uzantılarına göre dizine eklemek için a kullanırız. Tabii ki, bir anahtarın zaten var olup olmadığını kontrol etmeliyiz, bir liste başlatmalı, ekleyeceğiz, vb.

Dictionary<string, List<string>> fileGroups = new Dictionary<string, List<string>>();

foreach (string file in Directory.GetFiles(Environment.CurrentDirectory))
{
    string extension = Path.GetExtension(file).ToLower();

    if (!fileGroups.ContainsKey(extension))
    {
        fileGroups[extension] = new List<string>();
    }

    fileGroups[extension].Add(file);
}

LINQ eşdeğerini düşünün:

var query = from file in Directory.GetFiles(Environment.CurrentDirectory)
            group file by Path.GetExtension(file).ToLower();

Sorgunun kendisinin sadece 2 satır olduğunu, kesinlikle gelebilecek herhangi bir zorunlu çözümden daha kısa olduğuna dikkat edin. Ayrıca oldukça okunabilir; sinyal-gürültü oranı ilk çözümdekinden daha yüksektir. LINQ'da yeni olanlar için, bu sorgunun sonuçlarını aşağıdaki gibi çıkarırsınız:

foreach (var fileGroup in query)
{
    Console.WriteLine(String.Format("*** Files with extension: {0}", group.Key));

    foreach (string file in fileGroup)
    {
        Console.WriteLine(file);
    }
}

Daha karmaşık örneklerle, farklar normalde daha da genişler (örneğin, birden çok alana göre gruplandırmayı düşünün). Özetlemek gerekirse, LINQ birçok "günlük" veri sorgulama problemini genellikle daha kısa ve daha açıklayıcı bir şekilde çözmektedir. Bu, sözdizimini ve teknolojiyi öğrenmek zorunda kalmanın hafif bir maliyeti vardır, ancak faydalar olumsuzluklardan büyük ölçüde ağır basar.


Haritayı veya kapağı "sorgular" olarak sınıflandırıyor musunuz? Gerçekten değil ama sanırım belki görebiliyordum .. Ben normalde bir hesaplama sonucu değil, bir "sorgu" sonucu bir agrega düşünürdüm
Jimmy Hoffa

@JimmyHoffa Çoğunlukla hesaplamanın temeldeki koleksiyona uygulanmasına atıfta bulunuyorum, hesaplamanın kendisi değil. Ama benim benzetimimde muhtemelen boşluklar var, bu% 100 doğru değil açıklayıcı olması gerekiyordu.
Daniel B

@JimmyHoffa hayır, ama sonra sorgunun başlayacağı şeyin kesin bir tanımı olup olmadığından emin değilim
jk.

0

İlişkisel veritabanları için SQL ve XML için XQuery gibi çeşitli veri kaynağı türleri için zaman içinde farklı diller geliştirilmiştir. Bu nedenle, geliştiriciler desteklemeleri gereken her veri kaynağı türü veya veri biçimi için yeni bir sorgu dili öğrenmek zorunda kalmıştır. LINQ, çeşitli veri kaynakları ve formatlarındaki verilerle çalışmak için tutarlı bir model sunarak bu durumu basitleştirir. LINQ sorgusunda, her zaman nesnelerle çalışıyorsunuz. daha fazla bilgi için http://msdn.microsoft.com/en-us/library/bb397906.aspx adresini ziyaret edin.


Tam olarak LINQ, koleksiyonlarla çalışmak için bir soyutlama API'sidir. Bazı önemli faydaları: C # kullanarak STATIC elde edersiniz! Sorgularınızın ve dönüşümlerinizin doğrulanması
AndreasScheinert
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.