4

我需要创建一个代表总和值的前五个的字符串列表。

我有一个数据库,其中包含与不同服务有关的数百张账单

前任。电 600 美元 2013 年 1 月 水 50 美元 2013 年 1 月

我需要总结我在这里所做的所有相同服务

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] 成为我在列表中的第一个条目。

不确定如何按双精度值对字符串列表进行排序。

4

3 回答 3

6

使用看起来像这样的源,您的所有转换都变得容易:

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

(您可以考虑创建一个具有两个属性的具体类,namesum不是上面的匿名对象声明)。

现在:

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

等等。

同步列表很糟糕。

于 2013-07-11T16:49:05.560 回答
3

对于一般问题,我会使用Schwartzian transform,这是 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();
于 2013-07-11T16:47:14.673 回答
1

您可以为IComparable要查询的类实现接口,也可以创建一个实现该接口的新类IComparer并将其作为参数传递给 sort 方法。

于 2013-07-11T16:58:17.520 回答