2013-07-11 5 views
4

Мне нужно создать список строк, которые представляют первую пятерку суммированных значений.C# сортировка списка строк по списку пар

У меня есть база данных с сотнями счетов, относящихся к различным услугам

отл. электрический $ 600 января 2013 Вода $ 50 января 2013

мне нужно суммировать все те же услуги , которые я сделал здесь

public List<Double> GetSumOfSingleServices 
    { 
     get 
     { 

      var sums = (from dc in GetDashboardData        
         group dc by dc.serviceType into g 
         select g.Sum(sc => sc.serviceCost)).ToList(); 

      return sums; 
     } 
     set 
     { 
      NotifyPropertyChanged("GetSumOfSingleServices"); 
     } 

    } 

я создал список строку следующим кодом ниже

public List<String> GetServiceNames 
    { 
     get 
     { 

      var names = (from dc in GetDashboardData 
         group dc by dc.serviceType into g        
         select g.First().serviceType).ToList(); 

      return names; 
     } 
     set 
     { 
      NotifyPropertyChanged("GetServiceNames"); 
     } 
    } 

Теперь данные в этих двух списках являются параллельными значениями GetSumOfSingleServices [0] - это значение для GetServiceNames [0] и т. Д.

Я хотел бы иметь список, который имеет Strings, занимающий наивысшее значение из GetSumOfSingleServices, и так далее.

Так что если самый высокий GetSumOfSingleServices [3] и его параллельная строка - это GetServiceNames [3], то я хотел бы, чтобы GetServiceNames [3] была моей первой записью в списке.

Не знаете, как отсортировать список строк по двойным значениям.

Это

+4

Почему бы вам просто не создать единый список с составным объектом, содержащим как имя, так и сумму? Тогда это будет очень легко сортировать. Синхронизированные индексы пахнут очень плохо. – spender

ответ

3

Для общей проблемы я бы использовать Schwartzian transform, общая схема, используемая в Perl. Это должно быть легко port the underlying method to .net

Ваш случай еще проще, так как у вас есть полный контроль над доступом к данным:

var tuples = from dc in GetDashboardData 
      group dc by dc.serviceType into g 
      select new{ 
       Cost = g.Sum(sc=>sc.serviceCost), 
       Type = g.Key, 
      }; 
var sorted = tuples.OrderByDescending(t=>t.Cost).Select(t=>t.Type); 
return sorted.ToList(); 
6

с источником, который выглядит, как это, все ваши преобразования становятся легко:

var compositeList = GetDashboardData 
    .GroupBy(dc => dc.serviceType) 
    .Select(g => new{ 
        name = g.Key, 
        sum = g.Sum(sc => sc.serviceCost)}) 
    .ToList(); 

(вы можете подумать о создании конкретного класса с двумя свойствами name и sum вместо анонимного объявления объекта выше).

Сейчас:

compositeList.OrderByDescending(x => x.sum).Select(x => x.name); 

и так далее.

Синхронизированные списки сосать.

+1

Полностью согласен с тем, что синхронизирующие списки - это кошмар. Если данные изменяются между GetSumOfSingleServices() и GetServiceNames(), или если данные возвращаются в том порядке, который вы не ожидаете, все будет кончено. Это идеальный способ получить всю необходимую информацию в последовательной и предсказуемой манере. – MadHenchbot

1

Вы можете либо реализовать интерфейс IComparable для класса, который вы запрашиваете, либо создать новый класс, который реализует интерфейс IComparer и передает его как параметр методу сортировки.

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