Замена групп элементов в списке новыми вычисленными строками - PullRequest
0 голосов
/ 17 августа 2011

У меня есть список объектов, которые имеют 2 строковых атрибута и несколько двойных атрибутов каждый - есть дублирующиеся строки в том смысле, что строковые атрибуты одинаковы, а двойные атрибуты различны. Я пытаюсь объединить эти дубликаты в одну новую строку, которая вычисляется из значений двойных атрибутов. Упрощенный пример:

1. A, Text1, 5
2. A, Text2, 4
3. B, Text1, 7
4. A, Text1, 3

Взяв 'вычисленную строку' в качестве простого среднего, я должен получить:

1. A, Text1, 4 (5+3)/2
2. A, Text2, 4
3. B, Text1, 7

Вот что я сейчас делаю:

var groups = (from t in MyList group t by new { t.Field1, t.Field2});
foreach (var @group in groups)
{
   if (@group.Count() > 1)
   {         
      var newRow = new MyObject
                       {
                          Field1 = @group.ElementAt(0).Field1,
                          Field2 = @group.ElementAt(0).Field2,
                          Field3 = @group.Average(i => i.Field3)
                       };                        
   }
}

Который работает нормально. Я просто не уверен, как заменить строки в группах, над которыми я перебираю, так как для групп нет доступных методов remove. Первоначально я пытался сделать это с помощью вложенного для сравнения циклов, но поскольку я не мог изменить список, по которому я перебирал, я сохранял соответствующие индексы, но , что означало, что у меня n * (n -1) / 2 совпадений ...

Мне не хватает совершенно простого способа сделать это? Я не могу поверить, что это очень сложно, но я еще не смог решить это.

1 Ответ

1 голос
/ 17 августа 2011

Отвечая на мой собственный вопрос, а не удаляя его, так как он может быть полезным для кого-то, у кого был похожий мозговой блок:

Я слишком усложнял вещи - я просто создал и возвратил новый список с новыми строками + строками, которые не нуждались в обработке.

var groups = (from t in MyList group t by new { t.Field1, t.Field2 });
var returnList = new List<MyObject>();
foreach (var @group in groups)
{ 
   returnList.Add(new TradeScore
                      {
                         Field1 = @group.ElementAt(0).Field1,
                         Field2 = @group.ElementAt(0).Field2,
                         Field3 = @group.Average(i => i.Field3)
                      });
}
return returnList;

Simples.

Обратите внимание, что выполняет обработку всех групп, даже тех, которые имеют только 1 элемент Хотя их не нужно обрабатывать, среднее значение одного значения, очевидно, является этим значением, и оно избегает дополнительных if(...) {process and add} else {add}. Я сомневаюсь, что накладные расходы будут заметны, но за этим нужно следить.

...