C#按双打列表排序字符串列表

时间:2013-07-11 16:40:52

标签: c# linq

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

我有一个包含数百个与不同服务相关的账单的数据库

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

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

3 个答案:

答案 0 :(得分: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);

等等。

同步列表很糟糕。

答案 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方法。