在C#中如何不使用循环更新DataTable?

10
假设我的DataTable中有三列:
  1. 代码

  2. 名称

  3. 颜色

如果我知道代码和名称,如何更新与我的条件匹配的特定行的颜色? 我想做到这一点而不使用循环!

3
你为什么要不用循环来做这件事?世上无论如何都需要使用循环。即使你使用LINQ,内部仍然会执行循环。 - Cody Gray
Cody,OP想要更新1行。使用字典不需要循环。 - H H
一个表格不是字典。 - Chad Schouggins
5个回答

16

您可以使用LINQ:

DataRow dr = datatable.AsEnumerable().Where(r => ((string)r["code"]).Equals(someCode) && ((string)r["name"]).Equals(someName)).First();
dr["color"] = someColor;

当然,我假设所有这些标准都是字符串。你应该将类型转换为正确的类型。


现在我在 Data.EnumerableRowCollection 上遇到了错误,它不包含 .First() 方法。另外,我们只是更新一行数据,如何反映这些更改到 DataTable 中呢? - Zain Ali
确保你使用了 System.Linq,但如果没有被引用,Where() 也不应该工作。当你说“反映变化”时,你是指在屏幕上看到它们吗?你需要重新绑定 DataTable 到你用于显示它的对象。 - Farinha
就目前而言,这是可以接受的……然而,如果用户想要更新多行数据……这种方法行不通。 - undefined

12
// Use the Select method to find all rows matching the name and code.
DataRow[] rows = myDataTable.Select("name 'nameValue' AND code = 'codeValue');

for(int i = 0; i < rows.Length; i ++)
{
      rows[i]["color"] = colorValue;
}

这个更新的行将如何反映回(提交)到我的数据表中? - Zain Ali
@Zain:这已经完成了更新。使用 DataTable 的 Select 方法定位特定行并将新值分配给所需列即可。就是这样。 - CharithJ
应该是 DataRow[] rows = myDataTable.Select("name = 'nameValue' AND code = 'codeValue'"); - lstanczyk

5
DataTable recTable = new DataTable();

// do stuff to populate table

recTable.Select(string.Format("[code] = '{0}' and [name] = '{1}'", someCode, someName)).ToList<DataRow>().ForEach(r => r["Color"] = colorValue);

这仍然是一个循环。 - Neil Busse

0

使用 LINQ:

var dataRows = dt.AsEnumerable().Select(c => { c["color"] = c["Code"].ToString() == "1" ? "Red" : "White"; return c; });
dt = dataRows.CopyToDataTable();

-3
你可以这样做:
 foreach (DataRow row in datatable.Rows)
        {
            if(row["code"].ToString() == someCode && row["name"].ToString() == someName)

              {
                  row["color"] = someColor;
              }


        }

3
这个问题的提问者在问题中明确表示不希望使用循环。我知道这样做是可行的,但它已经从一开始就违反了问题的要求。 - IyaTaisho
如果请求的条件没有任何意义,像@Darren的这个“教科书式”的解决方案会受到其他可能用户的高度赞赏。任何LINQ例程都会在内部使用循环,而它们远不如简单的for循环高效。+1赞同。 - Lorenzo Bassetti

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接