LINQ按值排序字典

时间:2015-05-13 11:37:20

标签: c# linq

我试图在将值推入字典之前对值Descending进行排序。查询工作正常,但我只需要添加排序功能。

以下是我原来的LINQ查询

        List<Model> list = query1.Where(x => x.ItemsPrice.Any())
            .GroupBy(x => new { Student = query2.FirstOrDefault(y => y.Id == x. Id).Student.Name })
            .Select(x => new Model
            {
                StudentName = x.Key.Student,
                ClassItems = x.SelectMany(y => y. ItemsPrice)
                              .GroupBy(y => y. Price.item.Name)
                              .ToDictionary(y => y.Key, y => y.Sum(z => z.TotalPrice()))
            }).ToList();

我正在尝试以下代码,但它正在发出此错误

  

无法将IOrderedEnumerables隐式转换为System.Collection.Generic.Dictioanry。

.ToDictionary(y => y.Key, y => y.Sum(z => z.TotalPrice())).OrderByDescending(y => y.Value)

2 个答案:

答案 0 :(得分:3)

这样的事情对你有用:

public class MyComparer : IComparer<int>
{
  public int Compare(int x, int y)
  {
    return x.CompareTo(y);
  }
}

// ...
private void DoStuff()
{
  var dict = new Dictionary<int, int> {{3, 300}, {2, 200}};
  var sortedDict = new SortedDictionary<int, int>(dict, new MyComparer());
}

或者在您的具体情况中:

private class DescendingComparer : IComparer<string>
{
  int IComparer<string>.Compare(string a, string b)
  {              
    return StringComparer.InvariantCulture.Compare(b, a);
  }
}

// ....
ClassItems = new SortedDictionary<string, float>(x.SelectMany(y => y. ItemsPrice)
                                                .GroupBy(y => y. Price.item.Name)
                                                .ToDictionary(y => y.Key, y => y.Sum(z => z.TotalPrice())),
                                               new DescendingComparer());

注意:根据您的需要调整排序字典的键值和值类型以及比较器类型!

答案 1 :(得分:1)

无法保证项目存储在字典中的顺序。不要依赖它。从字典中检索项目时,可以在该点对其进行排序。

  

&#34;出于枚举的目的,字典中的每个项都被视为表示值及其键的KeyValuePair结构。返回项目的顺序未定义。&#34;

     

- MSDN

正如马库斯所指出的,如果您确实需要在字典中订购,请使用OrderedDictionary<,> classSortedDictionary<,> class