2010-06-11 34 views
7

Tôi có đối tượng StringCollection với 5 từ trong đó. 3 trong số đó là các từ trùng lặp. Tôi đang cố gắng tạo một truy vấn LINQ sẽ đếm số lượng từ duy nhất trong bộ sưu tập và xuất chúng ra bàn điều khiển. Vì vậy, ví dụ, nếu StringCollection tôi có 'nhà', 'Car', 'Nhà', 'chó', 'Cat', sau đó nó nên đầu ra như thế này:Đếm từ trong bộ sưu tập bằng LINQ

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

Bất kỳ ý tưởng về làm thế nào để tạo ra một LINQ truy vấn để làm điều này?

+0

Làm thế nào để bạn muốn xử lý vỏ? –

+0

Trường hợp bỏ qua. Mèo và mèo nên được coi là cùng một từ – Icemanind

+0

Tất cả các câu trả lời của bạn đều tuyệt vời ngoại trừ tôi dường như không có phương thức .GroupBy. Hãy nhớ rằng tôi đang sử dụng một đối tượng System.Collections.Specialized.StringCollection để lưu trữ các chuỗi, không phải là một mảng chuỗi. – Icemanind

Trả lời

11

Hãy thử như sau

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

+1 Nhưng điều này không bỏ qua trường hợp. –

+0

Tôi tin rằng một thay đổi đơn giản để 'nhóm từ bằng word.ToLower()' sẽ sửa chữa rằng, tất nhiên tất cả các phím của bạn sau đó sẽ được in thường. –

+0

Để công bằng, câu trả lời của anh ấy có thể được viết trước khi được thêm vào. –

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

Không! Sử dụng ToLower để so sánh chuỗi không phân biệt dạng chữ == facefalm.jpg – dtb

0

Nó phải là đơn giản như:

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

Điều đó sẽ hiển thị các chuỗi duy nhất, nhưng không hiển thị số lượng các chuỗi trùng lặp. –

+1

Điều này sẽ đếm số chuỗi duy nhất. do đó, nó sẽ trả về '4' –

+0

@Ray & @Matthew: Có, OP hỏi làm thế nào để đếm có bao nhiêu từ duy nhất có. Bây giờ ví dụ đã được định dạng, tôi nhận ra rằng đây không phải là những gì OP dự định yêu cầu ... – Guffa

1

Cho rằng bạn đang sử dụng StringCollection và muốn bỏ qua trường hợp, bạn sẽ cần để sử dụng Enumerable.GroupBy với Enumerable.Cast:

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); 
0
var query =  
    from s in Collection 
    group s by s.Description into g 
    select new {word = g.Key, num = g.Count()}; 
1

Để xây dựng một kết quả chuỗi giá trị duy nhất ...

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" 

Để đặt mỗi giá trị trên một dòng khác nhau ...

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

'.Cố ()' được thêm vào để hoạt động với 'StringCollection' –

Các vấn đề liên quan