LINQ

2010-06-11 14 views
7

kullanarak bir koleksiyondaki sözcükleri sayma Bunlarda 5 kelimelik bir StringCollection nesnesi var. 3 tanesi yinelenen kelimelerdir. Koleksiyonda kaç tane benzersiz kelime olduğunu ve bunları konsola gönderecek bir LINQ sorgusu oluşturmaya çalışıyorum. Yani, örneğin, benim StringCollection 'House', 'Araç', 'Ev', 'Köpek', 'Cat', varsa o zaman olması gerektiği şöyle çıkışı: Bir oluşturmaya ilişkinLINQ

 
House --> 2 
Car --> 1 
Dog --> 1 
Cat --> 1 

Herhangi bir fikir Bunu yapmak için LINQ sorgu?

+0

nasıl ancak kılıfı işlemek istiyorsun? –

+0

Muhafaza Yoksay. Kedi ve kedi aynı kelime olarak değerlendirilmelidir – Icemanind

+0

Tüm cevaplarınız harika .GroupBy yöntemine sahip olmadıkça harika. Dizeleri değil, bir dizi dizisini saklamak için bir System.Collections.Specialized.StringCollection nesnesi kullandığımı unutmayın. – Icemanind

cevap

11

aşağıdaki

var res = from word in col.Cast<string>() 
      group word by word into g 
      select new { Word = g.Key, Count = g.Count() }; 
+2

+1 Ancak bu durumun göz ardı edilmemesi anlamına geliyor. –

+0

Ben word.ToLower() 'ile kelime gruplandırmak için basit bir değişiklik olduğuna inanıyorum ki, tabii ki tüm anahtarlarınız küçük harf olacak. –

+0

Adil olmak gerekirse, cevabı muhtemelen eklenmeden önce yazılmıştır. –

4
var xs = new StringCollection { "House", "Car", "House", "Dog", "Cat" }; 

foreach (var g in xs.Cast<string>() 
        .GroupBy(x => x, StringComparer.CurrentCultureIgnoreCase)) 
{ 
    Console.WriteLine("{0}: {1}", g.Key, g.Count()); 
} 
0
foreach(var g in input.GroupBy(i => i.ToLower()).Select(i => new {Word = i.Key, Count = i.Count()}) 
{ 
    Console.WriteLine(string.Format("{0} -> {1}", g.Word, g.Count)); 
} 
+0

Hayır! Büyük/küçük harf duyarlılığı karşılaştırması için ToLower'ı kullanma == facefalm.jpg – dtb

0

kadar basit olmalıdır:

Console.WriteLine(stringCollection.Distinct().Count()); 
+1

Bu, benzersiz dizeleri gösterecek, ancak çoğaltılmış olanların sayısını göstermeyecektir. –

+1

Bu, benzersiz dizelerin sayısını sayar. Bu yüzden '4' –

+0

@Ray & @Matthew’i döndürdü: Evet, OP kaç tane benzersiz kelimenin sayılacağını sordu. Şimdi bu örnek biçimlendirildi, bunun OP'nin sormak istediği şey olmadığını anlıyorum ... – Guffa

1

Eğer StringCollection kullanarak ve olgu görmezden istediğiniz düşünüldüğünde deneyin, bunları gerekir Enumerable.Cast ile Enumerable.GroupBy'u kullanmak için:

0
var query =  
    from s in Collection 
    group s by s.Description into g 
    select new {word = g.Key, num = g.Count()}; 
1

tek bir dize değeri sonucunu oluşturmak için

var results = collection.Cast<string>.GroupBy(
     i => i, 
     (word, words) => new { Word = word, Count = words.Count() }, 
     StringComparer.CurrentCultureIgnoreCase 
    ); 

foreach(var wordPair in results) 
    Console.WriteLine("Word: \"{0}\" - Count: {1}", wordPair.Word, wordPair.Count); 
...
var stringCollection = new[] { "House", "Car", "house", "Dog", "Cat" }; 
var result = stringCollection.Cast<string>().GroupBy(
            k => k, 
            StringComparer.InvariantCultureIgnoreCase) 
          .Select(v => v.Key + " -->" + v.Count()) 
          .Aggregate((l,r)=>l+" " + r); 
//result = "House -->2 Car -->1 Dog -->1 Cat -->1" 

farklı bir hat üzerinde her değeri araya getirmek ...

var stringCollection = new[] { "House", "Car", "house", "Dog", "Cat" }; 
var result = stringCollection.Cast<string>().GroupBy(
            k => k, 
            StringComparer.InvariantCultureIgnoreCase); 

foreach (var value in result) 
    Console.WriteLine("{0} --> {1}", value.Key, value.Count()); 
+0

'.Cast ()' 'StringCollection' ile çalışmaya eklendi –