【问题标题】:Getting a of min. values from a dictionary得到一个分钟。字典中的值
【发布时间】:2015-03-21 22:50:48
【问题描述】:

具体说明:

我正在使用这样的字典:

Dictionary<int, Tuple<int, Node>>;

为了简单起见,假设 Node 包含一个 int 值。

由此,我想按元组的 Item1 以升序对其进行排序,然后按 Node 对象中包含的值对关系进行排序(即值相同),使得值和中的最小值排序后的节点值在前。

var sumList = from pair in openList
        orderby pair.Value.Item1 ascending
        select pair;

我已经完成了第一部分。如何更改此设置以便我也可以应用第二部分?

例子:

Node nod1 = new Node(1);
Node nod2 = new Node(2);
Node nod3 = new Node(3);
Node nod4 = new Node(4);

Dictionary.Add(3, nod1);
Dictionary.Add(3, nod4);
Dictionary.Add(2, nod2);
Dictionary.Add(2, nod3);

//result after sort
nod2
nod3
nod1
nod4

【问题讨论】:

  • 你对 Node 类的什么属性进行排序?
  • 节点中包含的一些 int。
  • 酷,应该很容易。如果它是一些自定义类型,您需要确保它实现了 IComparable。

标签: c# linq sorting dictionary


【解决方案1】:

你可以使用ThenBy...

var sumLists = openList
    .OrderBy(pair => pair.Value.Item1)
    .ThenBy(pair => pair.Value.Item2.NodeProperty);

【讨论】:

    【解决方案2】:

    我认为这会更容易通过表达式来实现,将其作为 IQueryable&lt;KeyValuePair&lt;int, Node&gt;&gt; 运行将允许您执行以下操作:

    openList.OrderBy(c => c.Value.Item1)
        .ThenBy(c => c.Value.Item2.NodeValuePropToSortOn)
    

    但是如果你需要使用查询语法,你可以这样做:

    var sumList = from pair in openList
        orderby pair.Value.Item1 ascending, pair.Value.Item2.NodeValuePropToSortOn ascending
        select pair;
    

    多个orderby 属性链接到OrderByThenBy

    【讨论】:

    • IQueryable 表达式绝对没有任何收获
    • 什么也没得到,但是语法可以或不能更清晰 - 取决于你在做什么 - 它是基于意见的 - 实际上,当你在查询表达式中说 orderby 时,它正在做与您所说的 .OrderBy(c =&gt; c.Key) 完全相同 - 它正在将 IL 映射为 call instance 到方法 Enumerable.OrderByQueryable.OrderBy 或 ThenBy,具体取决于。
    • 您的查询语法最终对我有用!非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 2020-01-02
    • 2021-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多