【问题标题】:C# DataTable -> Need to generate an ID based on the column valuesC# DataTable -> 需要根据列值生成一个ID
【发布时间】: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。

提前致谢!

【问题讨论】:

    标签: c# linq datatable c#-datatable


    【解决方案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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-06-09
          • 1970-01-01
          • 1970-01-01
          • 2015-10-24
          • 1970-01-01
          • 2022-10-21
          • 1970-01-01
          相关资源
          最近更新 更多