2009-01-19 106 views
1

以前我问过inserting a column into a dataset。我现在有一个类似的问题,即将两列或更多列合并为一列。如何合并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(string)); 

我需要的“名字”和“姓氏”列组合成所谓的“名”一列。

对我来说,创建一个将两个列合并在一起的方法还是一个可以用来将多个列合并在一起的更一般的方法是最好的方法?

我的想法是像下面创建排序的一般化方法:

MergeColumns(字符串格式,串mergedColumn,数据表DT,则params串[] columnsToMerge)

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

mergedColumn是新列的名称......但它必须能够与将要合并的列之一相同因为在我的现实世界中, m将“name”和“given_names”合并为“name”...但我仍然希望能够使用它,如果我需要合并“街道”,“城市”,“州”,“后科de“等列入名为”地址“的列。

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

MergeColumns( “{0} {1}”, “姓名”,的dataTable, “姓名”, “姓”);

给出了上述数据集,我期望得到的数据设置为如下所示:

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

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

回答

1

在我看来,这应该发生在数据层而不是逻辑层。据推测数据集消费者知道它需要什么数据并且可以明确地从数据存储请求它,而不必操纵数据集。

在一个数据库场景中,我本质上是一个多存储过程的方法,数据集的使用者将从合适的数据集检索数据。

+0

实际上这不是一个坏主意......我只是仔细检查了我已经提供的规范,并且没有任何内容说这不能在存储过程级别完成......这种方式我只回到“名称”列... – mezoid 2009-01-19 05:18:30

+0

我投这个答案,因为它允许我轻松地在存储的proc级别完成工作。虽然这个答案没有回答如何实际合并两列,但它确实表明我正在考虑解决方案。 – mezoid 2009-01-19 06:22:51

1

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

有些事情我能想到把我的头顶部,你必须处理:

你可能会碰到
  • 的一个问题是类型检查;如果用户想要合并日期字段或数字字段会发生什么情况。
  • 旧领域会发生什么?他们会留下还是被删除?如果您将此用作直接数据源,则可能需要删除左侧的列,因此某种RemoveOldColumns标志可能是个好主意。
+0

是的,这些都是有效的担忧......这让我觉得我应该尽可能以最简单的方式做到这一点。 – mezoid 2009-01-19 05:19:25

0
 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"]); 
4
public partial class Form1 : Form 
{ 
    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].MergeColumns("name", "lastname", "firstname"); 

     foreach (DataRow dr in ds.Tables[0].Rows) 
      MessageBox.Show(dr["name"].ToString()); 


    } 


} 

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


} 
1

或者,你可以这样做:

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


    } 
0

这究竟是我的要求,很多搜索的我在决定其更好地创建自己的数据表和使用结束后作为您的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是包含该过程的主返回表的数据集。

0
string result = string.Join(",", dtTotalQuery.AsEnumerable().Select(row => dtTotalQuery.Rows[0].ItemArray[0] + " " + dtTotalQuery.Rows[0].ItemArray[1]));