C# DataTable -> 需要根据列值生成一个ID

Posted

技术标签:

【中文标题】C# DataTable -> 需要根据列值生成一个ID【英文标题】:C# DataTable -> Need to generate an ID based on the column values 【发布时间】:2021-08-19 10:03:07 【问题描述】:
Value ID
A
A
A
B
B
C

期望的输出

Value ID
A 1
A 1
A 1
B 2
B 2
C 3

我需要根据对值列进行分组来创建 ID。所有 A 和 B 的单个 ID。

提前致谢!

【问题讨论】:

【参考方案1】:

您可以简单地使用如下循环:

for(int i = 0; i < dataTable.Rows.Count; i++) 
    switch(dataTable.Rows[i][0].ToString())
        case "A" :
            dataTable.Rows[i][1] = 1;
        break;
        case "B" :
            dataTable.Rows[i][1] = 2;
        break;
        case "C" :
            dataTable.Rows[i][1] = 3;
        break;
      // other cases
    

【讨论】:

【参考方案2】:

这里 dt 是您的数据表。使用这样的循环:

 int id = 1;
            for (int i = 0; i < dt.Rows.Count; i++)
            
                if (i == 0)
                
                    dt.Rows[i]["ID"] = id;
                    if (i != dt.Rows.Count && dt.Rows[i + 1]["Value"] != dt.Rows[i]["Value"])
                    
                        id++;
                    
                
                else
                
                    if (dt.Rows[i - 1]["Value"] == dt.Rows[i]["Value"])
                    
                        dt.Rows[i]["ID"] = id;
                    
                    else
                    
                        id = id + 1;
                        dt.Rows[i]["ID"] = id;
                    
                
            

【讨论】:

【参考方案3】:

如果值可能介于 A-Z 之间,请考虑在表单中完成以下操作,但可以在任何您想要的地方完成。

public class Replacement

    public string Value  get; set; 
    public int Index  get; set; 

表格代码

private void SetIdButton_Click(object sender, EventArgs e)

    var dataTable = MockedDataTable();
    var items = ReplacementData;

    for (int index = 0; index < dataTable.Rows.Count; index++)
    
        dataTable.Rows[index].SetField("ID",
            items.FirstOrDefault(replacement => 
                replacement.Value == dataTable.Rows[index].Field<string>("Value")).Index);
    

    foreach (DataRow row in dataTable.Rows)
    
        Console.WriteLine($"string.Join(",", row.ItemArray)");
    


private static Replacement[] ReplacementData 
    => "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    .ToCharArray().Select((value, index) => new Replacement
    
        Value = value.ToString(), 
        Index = index + 1
    )
    .ToArray();

private static DataTable MockedDataTable()

    DataTable dataTable = new DataTable();

    dataTable.Columns.Add("Value", typeof(string));
    dataTable.Columns.Add("ID", typeof(int));

    dataTable.Rows.Add("A");
    dataTable.Rows.Add("A");
    dataTable.Rows.Add("A");
    dataTable.Rows.Add("B");
    dataTable.Rows.Add("B");
    dataTable.Rows.Add("C");
    dataTable.Rows.Add("D");
    
    return dataTable;

输出

A,1
A,1
A,1
B,2
B,2
C,3
D,4

【讨论】:

以上是关于C# DataTable -> 需要根据列值生成一个ID的主要内容,如果未能解决你的问题,请参考以下文章

根据 C#2.0 中的列值过滤 DataTable 行

如何根据列值对每一行显示复选框 - JQuery DataTable

c# datatable 隐藏行?

C# DataTable.Select()根据条件筛选数据

C# DataTable.Select()根据条件筛选数据

C# DataTable.Select()根据条件筛选数据