在数据表中对行进行分组

时间:2014-05-30 19:58:40

标签: c# vb.net

我有这样的数据..

ID
1234-001
1234-002
1234-003
5678-001
7890-001
7890-002

我将这些数据保存在数据表中。我试图根据基数对组进行一些处理,即1234,5678,7890

如何遍历此数据表并保留新的(临时)数据表

1234-001,1234-002, 1234-003
clear the temp datatable then hold 
5678-001
clear the temp datatable then hold
7890-001,7890-002

我正在使用旧的代码库,LINQ不可用。我想不出一个优雅的解决方案。也许与数据视图有关,我不确定?

4 个答案:

答案 0 :(得分:1)

你说你不想使用LINQ但更喜欢优雅的解决方案......除非我在你的问题中遗漏了一些重要的东西,否则这个LINQified代码似乎可以让你做你想做的事。

var grouped = from d in data
    group d by d.Id.Split('-').FirstOrDefault();

foreach(var g in grouped) {
    // do something with each group
}

非LINQ,非变种答案:

DataTable data = new DataTable();
data.Columns.Add("ID");
data.Columns.Add("Value");

data.Rows.Add("1234-001", "Row 1");
data.Rows.Add("1234-002", "Row 2");
data.Rows.Add("1234-003", "Row 3");
data.Rows.Add("5678-001", "Row 4");
data.Rows.Add("7890-001", "Row 5");
data.Rows.Add("7890-002", "Row 5");

Dictionary<String, List<DataRow>> grouped = new Dictionary<String, List<DataRow>>();

foreach(DataRow r in data.Select()) {
    List<DataRow> groupedRows;
    String key = r["ID"].ToString().Split('-')[0];

    if(!grouped.TryGetValue(key, out groupedRows)) {
        groupedRows = new List<DataRow>();
        grouped[key] = groupedRows;
    }

    groupedRows.Add(r); 
}

foreach(KeyValuePair<String, List<DataRow>> g in grouped) {     
    String groupKey = g.Key;

    Console.WriteLine(groupKey);
    foreach(DataRow r in g.Value) {
        Console.WriteLine("\t{0}", r["Value"]);
    }
}

我得到以下输出,所以我没有看到&#34;它只将前3个分组并停止&#34;:

1234
  Row 1
  Row 2
  Row 3
5678
  Row 4
7890
  Row 5
  Row 5

答案 1 :(得分:1)

这是一个非Linq的例子。既然你说它已经排序了,你可以在一个循环中完成它。

DataTable dt1 = new DataTable();
dt1.Columns.Add("ID", typeof (string));
dt1.Rows.Add("1234-001");
dt1.Rows.Add("1234-002");
dt1.Rows.Add("1234-003");
dt1.Rows.Add("5678-001");
dt1.Rows.Add("7890-001");
dt1.Rows.Add("7890-002");

int i = 0;
while (i < dt1.Rows.Count)
{
    DataRow row = dt1.Rows[i];
    string key = row.Field<string>("ID").Split('-')[0];
    DataView dv = new DataView(dt1);
    dv.RowFilter = String.Format("ID LIKE '{0}*'", key.Replace("'", "''"));
    DataTable tempdt = dv.ToTable();

    i = i + tempdt.Rows.Count;
}

答案 2 :(得分:0)

这对一些人有帮助吗?

DataTable dt = new DataTable();
dt.Columns.Add("Data", typeof(string));

dt.Rows.Add("1234-001");
dt.Rows.Add("1234-002");
dt.Rows.Add("1234-003");
dt.Rows.Add("5678-001");
dt.Rows.Add("7890-001");
dt.Rows.Add("7890-002");


var stuff = from dr in dt.Select()
    group dr by dr["Data"].ToString().Split('-')[0] into g
    select new {First = g.Key, Records = g.ToList()};

    stuff.Dump();

答案 3 :(得分:0)

var groups = table.AsEnumerable();

List<List<DataRow>> groupList = (from g in table.AsEnumerable()
                                group g by g.Field<string>("id").ToString().Split('-').First() into Group1
select Group1.ToList()).ToList();