C# 分组数据表中的行

C# 分组数据表中的行,c#,vb.net,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

我有这样的数据

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不可用。我想不出一个优雅的解决办法。我不确定是否与数据视图有关?

这有帮助吗

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();

您说您不想使用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、非var答案:

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"]);
    }
}

下面是一个非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;
}
DataTable dt1=newdatatable();
dt1.Columns.Add(“ID”,typeof(string));
dt1.行。添加(“1234-001”);
dt1.行。添加(“1234-002”);
dt1.行。添加(“1234-003”);
dt1.行添加(“5678-001”);
dt1.行添加(“7890-001”);
dt1.行添加(“7890-002”);
int i=0;
而(i
var groups=table.AsEnumerable()

List groupList=(来自表中的g.AsEnumerable()
按g.Field(“id”).ToString()将g分组。将('-').First()拆分为组1
选择Group1.ToList()).ToList();

为什么不想使用LINQ?这是我正在使用的旧代码库,LINQ不可用。您正在处理的.NET版本是什么?如果它至少是2.0,那么您肯定可以安装.NET3.5,因为它运行在2.0CLR上。瞧,LINQ是可用的。您是否加载按此列排序的数据表?是的,我已经编写了对数据表排序的代码。所以它已经被分类了DVAR不是一个可用的关键字我正在处理一个旧代码base@NickLaMarca添加了一个非linq选项。能否向代码显示如何访问行中的字段,在该行中,您必须//对每个组执行某些操作此操作已结束,但它仅对前3个组进行分组并停止。你能在处理后将其更改为清除前3个,然后加载下一个集合,直到它到达数据的末尾吗?你必须将其转换为vb.net,但效果很好!Good jobvar不是一个可用的关键字我正在使用一个旧的代码库它有多旧。Net 1.1±2.0代码中没有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;
}
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();