我需要创建一个表示总和值前五位的字符串列表。
我有一个包含数百个与不同服务相关的账单的数据库
离。电动600美元2013年1月 水2013年1月50日
我需要总结所有相同的服务 我在这里做了
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]的值,依此类推。
我想要一个列表,其首先按GetSumOfSingleServices中的最高值排序,依此类推。
因此,如果最高的GetSumOfSingleServices [3]及其并行字符串是GetServiceNames [3],那么我希望GetServiceNames [3]成为我列表中的第一个条目。
不确定如何按双值对字符串列表进行排序。
这
答案 0 :(得分: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 :(得分: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();
答案 2 :(得分:1)
您可以为要查询的类实现IComparable
接口,也可以创建一个实现IComparer
接口的新类,并将其作为参数传递给sort方法。