首页 > 解决方案 > LINQ,按属性分组,同时保持其他属性排序

问题描述

所以我不完全确定如何解释我在这里想要做什么。我正在尝试获取一些数据(由下面的 Excel 文件屏幕截图表示),并且基本上按 Connection2 排序,同时将 Connection1 中的类似项目保持在一起。(在下面的屏幕截图中解释了一下)

这是我现在所拥有的:

var wires = RedConductorWires
    .OrderBy(x => x.Label)
    .ThenBy(x => x.Connection1)
    .ThenBy(x => x.Connection2)
    .ToList();

正在排序的类对象(匹配 Excel 屏幕截图):

public class CustomExcelFormat
{
    public string Label { get; set; }
    public string WireSize { get; set; }
    public string WireColor { get; set; }
    public string WirePartNumber { get; set; }
    public string Length { get; set; }
    public string Connection1 { get; set; }
    public string Connection1Torque { get; set; }
    public string Connection1Termination { get; set; }
    public string Connection1StripLength { get; set; }
    public string Checkbox1 { get; set; }
    public string Connection2 { get; set; }
    public string Connection2Torque { get; set; }
    public string Connection2Termination { get; set; }
    public string Connection2StripLength { get; set; }
    public string Checkbox2 { get; set; }
}

截屏: 在此处输入图像描述

问题:

问题是,如果您查看屏幕截图,棕色的“A1:TB7:M1”单元格也需要组合在一起,而绿色的“K7:10”需要组合在一起,同时保持它们的 Connection2 排序/组。

换句话说,连接 2 侧,K8:10 和 K8:11 需要保持组合在一起。

所以很明显我的 LINQ 查询不正确,我相信我需要进行某种分组然后排序,但我不确定如何处理它,甚至不知道如何准确地问这个问题(如果有人可以为我说的话)。我基本上需要按连接 2 中的项目分组,同时仍然保持连接 1 排序并放在一起。

如果有人能指出我可以做这样的事情的 LINQ 表达式的方向,那就太好了!

编辑

所以我使用了以下查询:

var wires = RedConductorWires
            .OrderBy(x => x.Label)
            .GroupBy(x => new { x.Connection2, x.Connection1 })
            .Select(grp => grp.ToList()).SelectMany(i => i).ToList();

并得到正确的分组。现在我只需要让它按字母顺序排序。见下图。

在此处输入图像描述

标签: c#linqsortinggrouping

解决方案


想象一下这条线

A - B
C - B
C - D
A - D

您可以以任何您喜欢的方式对行重新排序,或者将第一列分组或将第二列分组。但你永远不能同时拥有两者


推荐阅读