2016-07-18 7 views
-1

У меня есть динамически определенный вложенный список строк, который будет заполняться с использованием .txt;Как сгруппировать динамически определенный список по первому столбцу и рассчитать среднее значение для остальных?

Типичные значения TXT заключаются в следующем:

EPC1687626298729872,12.4,11.3,6.2 EPC1687626298729872,5,6,2 
EPC1687626298729872,8,7.3,4 EPC1687626DDDD29872,11.4,10.3,5.2 
EPC1687626DDDD29872,9,16,2 EPC2798272987298798,17,2,2 
EPC2987398239879832,11,3,2 EPC9827298729872987,4,5,6 
EPC3929873981310091,2,2,2 EPC982733U209309280,4,7,11 

Значения первого столбца (начиная с EPC) всегда требуется. Что мне нужно сделать, это сгруппировать строки, имеющие одинаковые значения EPC (значения первого столбца), и усреднить остальные значения по вступлению.

Например

EPC1687626298729872,12.4,11.3,6.2 EPC1687626298729872,5,6,2 
EPC1687626298729872,8,7.3,4 EPC1687626DDDD29872,11.4,10.3,5.2 
EPC1687626DDDD29872,9,16,2 

должен дать

EPC1687626298729872, (12.4+5+8)/3, (11.3+6+7.3)/3, (6.3+2+4)/3. 
EPC1687626DDDD29872, (11.4+9)/2 ,(10.3+16)/2, (5.2+2)/2 

Заранее спасибо за вашу помощь.

+0

Я был возиться с 2D массивов но у меня возникла проблема с Nullexception, поэтому я перешел в динамические вложенные списки и застрял в том, чтобы понять, как группировать первый столбец без назначения имен. Но благодаря ответу ниже я понял это. В любом случае. – HF20

ответ

1

Вы можете воспользоваться LINQ, чтобы выполнить это, поскольку он предоставляет множество методов группировки, вычисления средних и всех других видов манипуляций с данными.

Разбирает ваши данные

Поскольку у вас есть набор строк, которые имеют как строковые и числовые данные, вам нужно разделить каждый из ваших элементов, а затем разделить эти отдельные элементы вверх, то есть:

  • Разделите существующий вход, используя пробелы и символы новой строки, чтобы дать вам каждый элемент (например, EPC1687626298729872,12.4,11.3,6.2).
  • Затем разделите каждый из этих элементов, используя запятые в качестве разделителей, чтобы дать вам соответствующие значения (например, { Name : EPC1687626298729872, P1 : 12.4, ... }).

Это можно легко сделать с помощью String.Split() метода наряду с Enumerable.Select() методов LINQ, который может выглядеть следующим образом:

// Separate each of your elements 
var elements = input.Split(new string[]{" ", Environment.NewLine},StringSplitOptions.RemoveEmptyEntries) 
        // Separate each element of the string 
        .Select(x => x.Split(',')) 
        // Now you have a series of arrays for each element, so map each 
        // into an object 
        .Select(x => new { 
          Name = x[0], 
          P1 = Decimal.Parse(x[1]), 
          P2 = Decimal.Parse(x[2]), 
          P3 = Decimal.Parse(x[3]) 
        }); 

Сгруппируйте данные

После того, как у вас есть все ваши элементы проанализированы, теперь вы можете сгруппировать их в объекты, чтобы вы могли рассчитать средние показатели:

  • Группируйте каждый из своих элементов по их «имени» или «идентификатору» с помощью метода Enumerable.GroupBy().
  • Используйте эти группы, чтобы вычислить средние значения по методу LINQ's Enumerable.Average().

Это может выглядеть следующим образом:

// At this point you have all of your elements, so now group them 
// by their names and average 
var groups = elements.GroupBy(x => x.Name) 
        .Select(x => new { 
          Name = x.Key, 
          P1 = x.Average(y => y.P1), 
          P2 = x.Average(y => y.P2), 
          P3 = x.Average(y => y.P3) 
        }); 

На данный момент, вы можете просто перебирать свои результаты и получить то, что вам нужно:

enter image description here

+0

Большое спасибо за помощь. Код работает очень хорошо, однако все равно, чтобы преобразовать этот Generic во вложенный список? Вот что я пытался до сих пор: Список группы = Db.GroupBy (х => x.Name) .Select (х => новый { Name = x.Key, P1 = x.Average (у = > y.P1), Р2 = x.Average (у => y.P2), Р3 = x.Average (у => y.P3) }) .AsEnumerable() .ToList(); Любые предложения? – HF20

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

  • Нет связанных вопросов^_^