C# 如何合并数据集中的两列?

C# 如何合并数据集中的两列?,c#,merge,dataset,C#,Merge,Dataset,以前我问过。我现在有一个类似的问题…即将两个或多个列合并为一个列 假设我有以下数据集: DataSet ds = new DataSet(); ds.Tables.Add(new DataTable()); ds.Tables[0].Columns.Add("id", typeof(int)); ds.Tables[0].Columns.Add("firstname", typeof(string)); ds.Tables[0].Columns.Add("lastname", typeof(st

以前我问过。我现在有一个类似的问题…即将两个或多个列合并为一个列

假设我有以下数据集:

DataSet ds = new DataSet();
ds.Tables.Add(new DataTable());
ds.Tables[0].Columns.Add("id", typeof(int));
ds.Tables[0].Columns.Add("firstname", typeof(string));
ds.Tables[0].Columns.Add("lastname", typeof(string));
我需要将“firstname”和“lastname”列合并成一个名为“name”的列

我最好创建一个将两列合并在一起的方法,还是创建一个可用于将多个列合并在一起的更通用的方法

我的想法是创建一种类似以下的通用方法:

合并列(字符串格式、字符串合并列、数据表dt、参数字符串[]列合并)

用户提供如下格式:“{0}{1}”

mergedColumn是新列的名称…但它必须能够与将要合并的列之一相同,因为在我的现实世界中,我正在将“名称”和“给定名称”合并到“名称”中…但是如果我需要将“街道”、“城市”、“州”、“邮政编码”等合并到一个名为“地址”的列中,我仍然希望能够使用它

我认为这将被使用的方式如下:

DataSet ds = new DataSet();
ds.Tables.Add(new DataTable());
ds.Tables[0].Columns.Add("id", typeof(int));
ds.Tables[0].Columns.Add("name", typeof(string));
合并列(“{0}{1}”,“名称”,数据表,“名字”,“姓氏”)

鉴于上述数据集,我希望生成的数据集如下所示:

DataSet ds = new DataSet();
ds.Tables.Add(new DataTable());
ds.Tables[0].Columns.Add("id", typeof(int));
ds.Tables[0].Columns.Add("name", typeof(string));

这似乎是一个合理的方法吗?像这样的方法已经存在了吗?我不想重新发明轮子。另外,我是否正在创建一个比我现在实际需要的做得更多的方法?

如果数据集足够具体,使用MergeName()方法就可以了。如果你认为你不会在不止一个地方使用它,这一点尤其正确。一个通用的方法需要做更多的工作,但是如果你要进行大量的合并,那么它可能是值得的

有些事情我可以从脑海中想出来,你必须处理:

  • 您可能遇到的一个问题是类型检查;如果用户希望合并日期字段或数字字段,会发生什么情况
  • 老田地怎么了?它们将保留还是删除?如果将其用作直接数据源,则可能需要删除剩余的列,因此某种
    RemoveOldColumns
    标志可能是一个好主意

    • 在我看来,这应该发生在数据层,而不是逻辑层。数据集使用者可能知道它需要什么样的数据,并且可以显式地从数据存储中请求数据,而无需操作数据集

      在数据库场景中,我基本上支持多存储过程方法,数据集使用者将从相应的存储过程中检索数据。

      公共部分类Form1:Form
      
              DataSet ds = new DataSet();
              ds.Tables.Add(new DataTable());
              ds.Tables[0].Columns.Add("id", typeof(int));
              ds.Tables[0].Columns.Add("firstname", typeof(string));
              ds.Tables[0].Columns.Add("lastname", typeof(string));
      
      
              ds.Tables[0].Rows.Add(1,"torvalds", "linus");
              ds.Tables[0].Rows.Add(2,"lennon", "john");
      
      
              ds.Tables[0].Columns.Add("name", typeof(string));
              foreach (DataRow dr in ds.Tables[0].Rows) dr["name"] = dr["lastname"] + ", " + dr["firstname"];
      
      
              foreach (DataRow dr in ds.Tables[0].Rows)
                  MessageBox.Show(dr["name"]);
      
      { 公共表格1() { 初始化组件(); 数据集ds=新数据集(); Add(newdatatable()); 表[0].Columns.Add(“id”,typeof(int)); 表[0].Columns.Add(“firstname”,typeof(string)); 表[0].Columns.Add(“lastname”,typeof(string)); 表[0].Rows.Add(1,“torvalds”,“linus”); 表[0].Rows.Add(2,“列侬”,“约翰”); 表[0]。合并列(“名称”、“lastname”、“firstname”); foreach(ds.Tables[0].行中的数据行dr) Show(dr[“name”].ToString()); } } 公共静态类助手 { 公共静态void MergeColumns(此数据表t、字符串newColumn、参数字符串[]columnsToMerge) { t、 Columns.Add(newColumn,typeof(string)); var sb=新的StringBuilder(); sb.追加(“{0},”); 对于(int i=1;ir[col]).ToArray()); } }
      或者,您可以执行以下操作:

          public Form1()
          {
              InitializeComponent();
      
      
              DataSet ds = new DataSet();
              ds.Tables.Add(new DataTable());
              ds.Tables[0].Columns.Add("id", typeof(int));
              ds.Tables[0].Columns.Add("firstname", typeof(string));
              ds.Tables[0].Columns.Add("lastname", typeof(string));
      
      
              ds.Tables[0].Rows.Add(1,"torvalds", "linus");
              ds.Tables[0].Rows.Add(2,"lennon", "john");    
      
      
              ds.Tables[0].Columns.Add("name", typeof(string), "lastname + ', ' + firstname"); 
      
      
              foreach (DataRow dr in ds.Tables[0].Rows)
                  MessageBox.Show(dr["name"].ToString());
      
      
          }
      

      这正是我的要求,在进行了大量搜索之后,我最终决定最好创建自己的数据表,并将其用作ListBox或DropDownList的数据源(以需要的为准)

      DataTable dt = new DataTable();
      dt.Columns.Add("Test",typeof(String));
      foreach (DataRow r in ds.Tables[0].Rows)
      {
        DataRow dr = dt.NewRow();
        dr["Test"] = r["LastName"] + " ," + r["firstName"];
        dt.Rows.Add(dr);
      }
      

      此处
      ds
      是包含程序主返回表的数据集。

      扩展方法,可选择分隔符和位置

      string result = string.Join(",", dtTotalQuery.AsEnumerable().Select(row => dtTotalQuery.Rows[0].ItemArray[0] + " " + dtTotalQuery.Rows[0].ItemArray[1]));
      
      public static class Helper
      {
          public static void MergeColumns(this DataTable t, string newColumn, params string[] columnsToMerge)
          {
              t.Columns.Add(newColumn, typeof(string));
      
              var sb = new StringBuilder();
      
              sb.Append("{0}, ");
              for (int i = 1; i < columnsToMerge.Length; ++i)
                  sb.Append("{" + i.ToString() + "}");
      
              string format = sb.ToString();
      
              foreach(DataRow r in t.Rows)
                  r[newColumn] = string.Format(format, columnsToMerge.Select(col => r[col]).ToArray() );
          }
      }
      

      事实上,这不是一个坏主意…我只是对我收到的规范做了双重检查,其中没有任何内容表明这不能在存储过程级别完成…这样我只会得到一个“名称”列…我投票作为答案,因为它允许我在存储过程级别轻松完成工作。虽然这个答案没有回答如何合并两列,但它确实表明我对解决方案考虑过多。是的,这些都是合理的问题…这让我觉得我应该用最简单的方式来做。这更接近我想要的…所以我投了赞成票。我接受了杰森的回答,因为这是解决我问题的最简单的方法。使用这种方法,我原本认为我必须为有限的利益做太多的事情。但是谢谢你的贡献!
      //DataTable dt
      dt.MergeColumns("name", 0, " ", "lastname", "firstname");