如何在复杂对象上使用group by?

时间:2013-11-21 12:43:15

标签: c# linq entity-framework

我正在处理一个复杂的对象。该对象具有类型public List<ExcelDataRow> DataRows的列表属性 ExcelDataRow对象具有public Dictionary<string,string> Cells属性,这是一个字典。

我的目标是使用group by或self join根据单元格字典中的值对excel数据行进行分组。

这是保存excel数据的类结构:

public class ExcelData
{
    public ExcelStatus Status { get; set; }
    public Columns ColumnConfigurations { get; set; }
    public List<string> Headers { get; set; }
    public List<ExcelDataRow> DataRows { get; set; }
    public string SheetName { get; set; }

    public ExcelData()
    {
        Status = new ExcelStatus();
        Headers = new List<string>();
        DataRows = new List<ExcelDataRow>();
    }

    public class ExcelDataRow
    {
        public int RowIndex { get; set; }
        public Dictionary<string,string> Cells { get; set; }

        public ExcelDataRow()
        {
            this.Cells = new Dictionary<string, string>();
        }
    }
}

这是我正在处理的示例excel表:

Alias List 1    A   Y   N   English
Alias List 1    B   Y   N   English
Alias List 1    C   Y   N   English
Alias List 1    D   Y   N   English
Alias List 2    E   Y   Y   English
Alias List 2    F   Y   N   English
Alias List 2    G   Y   N   English

所以在上面的示例中,我想按第一列分组,即A列最后有两组Alias List 1Alias List 2

我已经编写了这段代码,但我仍然得到了相同的7行。

var rows = sheet.DataRows
    .GroupBy(r => r.Cells
    .Where(c => c.Key.Length == 2 && c.Key.StartsWith("A"))
    .Select(c => c.Value))
    .ToList(); 

我的目标是获取两个按第一列名称分组的数据行列表,如果这是可以使用任何方法获取的,请随时提供建议。

感谢

1 个答案:

答案 0 :(得分:3)

您正在选择单元格列表而不是单个单元格。这会使GroupBy混淆。

请改为尝试:

sheet.DataRows.GroupBy(r => r.Cells["A" + r.RowIndex]);

请注意,使用RowIndex修复了超过10行的错误,其中长度为3,而不是2。