如何将数据分组到具有不同值c#的单独列表中?

时间:2014-02-11 10:24:28

标签: c# linq

我有一个数据表,如下所示,

enter image description here

我有一个返回列表的服务, enter image description here

我想使用linq对具有不同rowid和字段名称的数据进行分组并将它们放入 单独的清单。我怎么能实现它?

这是我按ID分组的代码

   var query = ae.Result.CommonDataValues.GroupBy(item => item.RowID)
                      .Select(g => g.Max(item => item.ID));

3 个答案:

答案 0 :(得分:0)

为什么不使用linq GroupBy,然后使用ForEach?

如下所示;

            // Group the result by rowId
            finalData.GroupBy(x => x.rowid).ForEach(group =>
            {
                // Group would be the items which you are after...
                // Do your logic here?
            });

您可以通过在项目中添加此扩展来创建ForEach IEnumerable函数;

public static void ForEach(this IEnumerable enumeration, Action action)
{
    foreach(T item in enumeration)
    {
        action(item);
    }
}

您可以通过访问ForEach中的组变量来获取您的MAX等,以及您所有的一切......它应该适合您。

答案 1 :(得分:0)

假设你想要/有一个映射这些属性的类,如:

public class Data
{
    public int ID { get; set; }
    public int RecordID { get; set; }
    public int RecordFieldData { get; set; }
    public int RowID { get; set; }
    public int FieldID { get; set; }
    public string FieldName { get; set; }
}

并且您希望List<List<Data>>包含List<Data>的每个唯一RowID + FieldName组合,您可以GroupBy匿名类型:

List<List<Data>> allData = data.AsEnumerable()
    .GroupBy(r => new { RowID = r.Field<int>("RowID"), FieldName = r.Field<string>("FieldName") })
    .Select(g => g
        .Select(r => new Data
        {
            RowID = g.Key.RowID,
            FieldName = g.Key.FieldName,
            FieldID = r.Field<int>("RowID"),
            ID = r.Field<int>("ID"),
            RecordFieldData = r.Field<int>("RecordFieldData"),
            RecordID = r.Field<int>("RecordID")
        })
        .ToList())
    .ToList();

如果您想使用Dictionary代替RowId + FieldName作为关键字:

Dictionary<Tuple<int, string>, List<Data>> allData = data.AsEnumerable()
    .GroupBy(r => new { RowID = r.Field<int>("RowID"), FieldName = r.Field<string>("FieldName") })
    .ToDictionary(
        g => Tuple.Create(g.Key.RowID, g.Key.FieldName), 
        g => g.Select(r => new Data
            {
            RowID = g.Key.RowID,
            FieldName = g.Key.FieldName,
            FieldID = r.Field<int>("RowID"),
            ID = r.Field<int>("ID"),
            RecordFieldData = r.Field<int>("RecordFieldData"),
            RecordID = r.Field<int>("RecordID")
        })
        .ToList());

// lookup with RowId + FieldName, f.e.:
List<Data> datas;
if(allData.TryGetValue(Tuple.Create(1, "name"), out datas))
{
    // dictionary contains this data
}

答案 2 :(得分:0)

另一种变体

var query = from cdv in ae.Result.CommonDataValues
            group cdv by new {cdv.RowID, cdv.FieldName} into g
            select g.ToList()

如果你只想为一个领域灌浆,你可以试试这个

var query = from cdv in ae.Result.CommonDataValues
            group cdv by new cdv.RowID into g
            select g.ToList()