2015-04-28 4 views
0

У меня есть функция списка в консольном приложении на C#. Эта функция списка имеет разные элементы, где они выглядят примерно так: 'matt,5' 'matt,7' 'jack,4' 'jack,8' и т. Д.Функция списка, как получить среднее количество баллов для каждого приложения с именем-C#

Я хочу, чтобы иметь возможность комбинировать все имена, где я вижу только их имя, записанное один раз, а число после них усредняется, поэтому как 'jack,5+7/2', который затем будет отображаться как 'jack,6'.

До сих пор у меня есть это ...

currentFileReader = new StreamReader(file); 
List<string> AverageList = new List<string>(); 
while (!currentFileReader.EndOfStream) 
{ 
    string text = currentFileReader.ReadLine(); 
    AverageList.Add(text.ToString()); 
} 
AverageList.GroupBy(n => n).Any(c => c.Count() > 1); 

Не совсем уверен, куда идти отсюда.

+5

может сделать вашу жизнь проще, если бы у вас были какое-то модель данных для хранения этой информации в вместо того, чтобы работать только с Списком . –

+1

, пожалуйста, покажите весь соответствующий код, а также посмотрите на вопрос о том, как задать вопрос .. это довольно плохо отформатированный вопрос .. – MethodMan

+1

Дайте этому парню перерыв, так много нисходящих слов для не такого плохого вопроса – CriketerOnSO

ответ

4

Что вам нужно, чтобы Split каждый свой строковый элемент на , и группу первым элементом возвращаемого массива и среднего второго элемента массива (после разбора его int) что-то вроде:

List<string> AverageList = new List<string> { "matt,5", "matt,7", "jack,4", "jack,8" }; 
var query = AverageList.Select(s => s.Split(',')) 
    .GroupBy(sp => sp[0]) 
    .Select(grp => 
     new 
     { 
      Name = grp.Key, 
      Avg = grp.Average(t=> int.Parse(t[1])), 
     }); 
foreach (var item in query) 
{ 
    Console.WriteLine("Name: {0}, Avg: {1}", item.Name, item.Avg); 
} 

и это даст вам:

Name: matt, Avg: 6 
Name: jack, Avg: 6 

Но, лучшим вариантом было бы использовать класс с Name и Score свойствами вместо значений, разделенных запятыми.

(код не проверяет недопустимые входные значения).

0

Во-первых, вы захотите заполнить ваши неформатированные данные в список, как видите, я назвал его rawScores. Затем вы можете разделить каждую строку запятой, разделяющей их. Затем вы можете проверить, находится ли существующий человек в вашем словаре и добавить к нему свой счет, или, если не создать нового человека.

После этого вам просто нужно создать Среднее списка.

Надеюсь, это поможет!

var scores = new Dictionary<string, List<int>>(); 
       var rawScores = new List<string>(); 
       rawScores.ForEach(raw => 
       { 
        var split = raw.Split(','); 
        if (scores.Keys.All(a => a != split[0])) 
        { 
         scores.Add(split[0], new List<int> {Convert.ToInt32(split[1])}); 
        } 
        else 
        { 
         var existing = scores.FirstOrDefault(f => f.Key == split[0]); 
         existing.Value.Add(Convert.ToInt32(split[1])); 
        } 
       }); 
Смежные вопросы