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