2009-11-26 4 views
0

У меня есть список C# с множеством похожих имен. Я хочу рассчитать все похожие слова.Как получить количество похожих слов в списке?

Пример

Пусть список имеет следующие значения

one,one,one,two,two,four,four,four 

тогда я хочу, чтобы вычислить, как этот

one 3 
two 2 
four 3 

как я могу вычислить значение, как это из списка.

+0

Сохраняется ли эта запятая? – ChaosPandion

ответ

9

Я бы разделил строку на запятую, пропустил все результаты и добавил каждое слово в хэш-таблицу или словарь со значением один. Если слово (ключ) уже присутствует, то увеличивайте значение.

string[] values = "one,one,one,two,two,four,four,four".Split(','); 
var counts = new Dictionary<string, int>(); 

foreach (string value in values) { 
    if (counts.ContainsKey(value)) 
     counts[value] = counts[value] + 1; 
    else 
     counts.Add(value, 1); 
} 

Или, если вы предпочитаете, здесь есть решение LINQ

var counts = values.GroupBy<string, string, int>(k => k, e => 1) 
    .Select(f => new KeyValuePair<string, int>(f.Key, f.Sum())) 
    .ToDictionary(k => k.Key, e => e.Value); 
+0

+1 должен был что-то сделать. – ChaosPandion

+0

Вам нужно добавить триммер для значения X-) –

+2

Хотя я лично использовал бы counts [value] ++; – ChaosPandion

0
Dictionaty<string, int> listCount = new Dictionaty<string, int>(); 
for (int i = 0; i < yourList.Count; i++) 
{ 
if(listCount.ContainsKey(yourList[i])) 
    listCount[yourList[i].Trim()] = listCount[yourList[i].Trim()] + 1; 
else 
    listCount[yourList[i].Trim()] = 1; 
} 
6

Вот решение, основанное на Linq:

string s = "one,one,one,two,two,four,four,four"; 
    List<string> list = s.Split(',').ToList(); 

    Dictionary<string, int> dictionary = list.GroupBy(x => x) 
     .ToDictionary(x => x.Key, x => x.Count()); 

    foreach (var kvp in dictionary) 
     Console.WriteLine("{0}: {1}", kvp.Key, kvp.Value); 

Выход:

one: 3 
two: 2 
four: 3 

Это решение не использует преимущества того, что общие значения являются последовательными. Если это всегда так, может быть написано несколько более быстрое решение, но это хорошо для коротких списков или если элементы могут прийти в любом порядке.

0

Для списка, вы можете сделать следующее (непроверенные):

List<string> list = new List<string>() 
    { 
    "One", 
    "One", 
    "Two", 
    // etc 
    } 

Dictionary<string, int> d = new Dictionary<string, int>(); 

foreach (string s in list) 
{ 
    if (d.ContainsKey(s)) 
    d.Add(s, 1); 
    else 
    d[s]++; 
} 

Предпочтительным (и чище) способ сделать это, используя GroupBy и граф с Linq, но я не имею вид на введите синтаксис в данный момент.

Удачи вам!

+1

Опыты, которые вам не хватает! символ. – ChaosPandion

Смежные вопросы