C#用一个双字符列表对字符串列表进行排序
本文关键字:列表 字符串 排序 字符 一个 | 更新日期: 2023-09-27 18:21:56
我需要创建一个字符串列表,表示求和值的前五个。
我有一个数据库,里面有数百张与不同服务有关的账单
前任。电动$600 2013年1月水$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]等的值。
我想要一个列表,其中字符串按GetSumOfSingleServices的最高值排名第一,依此类推
因此,如果最高的GetSumOfSingleServices[3]及其并行字符串是GetServiceNames[3],那么我希望GetServiceNames[3]是我在列表中的第一个条目。
不知道如何按双值对字符串列表进行排序。
有了这样的源代码,所有的转换都变得很容易:
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);
等等
同步列表很糟糕。
对于一般问题,我会使用Schwartzian变换,这是Perl中使用的一种常见模式。将底层方法移植到.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();
您可以实现要查询的类的IComparable
接口,也可以创建一个实现IComparer
接口的新类,并将其作为参数传递给排序方法。