我创建了3个数据表
var dt1= new DataTable();
var dt2= new DataTable();
var dt3= new DataTable();
然后我循环
foreach (DataRow row1 in dt1.Rows)
{
dt3.Rows.Add(row1.ItemArray);
foreach (DataRow row2 in dt2.Rows)
{
var Id2 = row1["Id"];
var Id1= row2["Id"];
if (Id1 == Id2)
{
dt3.rows["Name"] = "" ; // doesnt work
}
}
}
正如您所看到的,我在2个数据表上循环。然后在内循环中检查记录是否匹配。现在,如果记录匹配,那么我想更新dt3数据表上的“名称”列。
我尝试使用
dt3.rows["Name"] = "" ;
但这不起作用。我知道它的原因,因为我再次需要循环在dt3数据表和 将值赋给该循环中的列。但不知道该怎么做以及是否有更好的解决方案。我的意思是我们可以在dt3 datatable中找到id然后更新值。但不知道该怎么做 是否有更智能的解决方案而不是在2个表上循环?
答案 0 :(得分:2)
不需要第一个foreach。简单的DataTable.Copy将带来目标表中原始表的所有数据和结构。然后在第二个表上循环,在第三个表上Select循环,找到匹配的行并清除名称。
dt3 = dt1.Copy();
foreach (DataRow row2 in dt2.Rows)
{
DataRow[] match = dt3.Select("ID=" + row2["ID"].ToString());
if(match.Lenght > 0)
match[0]["Name"] = "" ;
}
不确定这是否与其他答案相比更具竞争力。需要测试
答案 1 :(得分:1)
dt3.rows
不起作用,您想要更改现在添加的行的名称。这应该有效:
foreach (DataRow row1 in dt1.Rows)
{
DataRow newRow = dt3.Rows.Add(row1.ItemArray);
foreach (DataRow row2 in dt2.Rows)
{
var Id2 = row1["Id"];
var Id1 = row2["Id"];
if (Id1 == Id2)
{
newRow["Name"] = "new Name";
}
}
}
答案 2 :(得分:1)
怎么样,
dt2Lookup = new HashSet(
dt2.AsEnumerable().Select(row => row.Field<int>("Id")));
dt3 = dt1.Clone();
forreach (var row In dt1.AsEnumerable())
{
var newRow = dt3.Rows.Add(row.ItemArray)
if (dt2lookup.Contains(row.Field<int>("Id"))
{
newRow.SetField("Name", string.Empty);
}
}
HashSet
应提供良好的查找性能。
答案 3 :(得分:1)
dt3 = dt1.Copy();
var RowDictionary = dt3.Rows.OfType<DataRow>().ToDictionary(dr => dr["ID"].ToString());
//replace by Dictionary<string,List<DataRow>> in case ID is not unique and fill it with a foreach loop.
foreach (DataRow row2 in dt2.Rows)
{
DataRow Match;
if (c.TryGetValue(row2["ID"].ToString(), out Match))
{
Match["Name"] = "";
}
}
答案 4 :(得分:0)
你应该致电:
dt3.rows[dt3.rows.Count - 1].Columns["Name"] = "" ;
答案 5 :(得分:0)
试试这个:
foreach (DataRow row1 in dt1.Rows)
{
var row = dt3.Rows.Add(row1.ItemArray);
foreach (DataRow row2 in dt2.Rows)
{
var Id2 = row1["Id"];
var Id1= row2["Id"];
if (Id1 == Id2)
{
row["Name"] = ""; //maybe works
}
}
}