我正在遍历数据表,目前我正在
string customerId = row["CustomerId"].ToString();
string companyName = row["Company Name"].ToString();
而不是声明每个变量如何添加这些变量做词典? 我想的是:
foreach (DataRow row in customerTbl.Rows)
{
Dictionary<string, string> customerDictionary = new Dictionary<string, string>();
customerDictionary.Add(row[].ToString(), row[].ToString());
所以是的,如何获取行名称和值?
提前致谢。
编辑:
我想我没有给你关于我要做什么的所有信息。 我为客户查询数据库并填充大约50列的数据表,我使用客户ID查询另一个数据库并从那里获得相同的客户。然后,我想比较来自同一客户的两个数据库的所有50个字段,并检查是否有任何字段不同。我以为我可以在每个客户的每一行的字典中添加列名和值,然后用两个循环检查相同键(列名)的值是否不同,这是一种完全错误的方法吗?
对于50个字段,if(customerId1!= customerId2 || customerName1!= customerName2 ||等等)不是很好。
答案 0 :(得分:2)
您是否在寻找通用的解决方案?如果是这样,您的DataTable总是包含2列,其中第一列可以被视为字典键,第二列可以被视为值?如果是这样,那么只需使用列索引而不是列名
var customerDictionary = new Dictionary<string, string>();
foreach (DataRow row in customerTbl.Rows)
customerDictionary.Add(row[0].ToString(), row[1].ToString());
如果customerId和CompanyName列中的值永远不为null,则可以将值转换为字符串
而不是使用ToString()customerDictionary.Add((string)row[0], (string)row[1]);
仅供参考,DataTable也具有搜索功能(Find()方法)。如果设置主键列,搜索速度非常快,您可能不需要将数据从DataTable复制到字典。
编辑:根据OP编辑的问题,在C#代码中执行此操作的一种完整工作示例
class Program
{
static void Main(string[] args)
{
var table1 = GetCustomersFromFirst();
var table2 = GetCustomersFromSecond();
foreach (DataRow row in table1.Rows)
{
var foundRows = table2.Select("CustomerId = " + (string)row[0]);
if (foundRows.Length == 1)
{
var foundRow = foundRows[0];
foreach (DataColumn col in table1.Columns)
{
var valueOfColumnFromTable1 = row[col.Ordinal].ToString();
var valueOfColumnFromTable2 = foundRow[col.Ordinal].ToString();
if (String.Compare(valueOfColumnFromTable1, valueOfColumnFromTable2) != 0)
{
//the colum values are not the same.
}
}
}
else
{
// Something is wrong since more than one matching record was found
// or no matching records were found.
}
}
}
static DataTable GetCustomersFromFirst()
{
var dt = GetInitializedCustomerDataTable();
var row = dt.NewRow();
row[0] = "1";
row[1] = "CompanyA";
dt.Rows.Add(row);
row = dt.NewRow();
row[0] = "2";
row[1] = "CompanyB";
dt.Rows.Add(row);
row = dt.NewRow();
row[0] = "3";
row[1] = "CompanyC";
dt.Rows.Add(row);
return dt;
}
static DataTable GetCustomersFromSecond()
{
var dt = GetInitializedCustomerDataTable();
var row = dt.NewRow();
row[0] = "1";
row[1] = "CompanyA";
dt.Rows.Add(row);
row = dt.NewRow();
row[0] = "2";
row[1] = "CompanyD";
dt.Rows.Add(row);
row = dt.NewRow();
row[0] = "3";
row[1] = "CompanyC";
dt.Rows.Add(row);
return dt;
}
static DataTable GetInitializedCustomerDataTable()
{
var dt = new DataTable();
dt.Columns.Add("CustomerId", typeof(string));
dt.Columns.Add("CompanyName", typeof(string));
return dt;
}
}
在测试数据中,第2行不匹配。所以它应该落入评论所说的条件: //列的值不一样。
就个人而言,我会考虑在数据库本身中这样做。
答案 1 :(得分:1)
试试这个。
Dictionary<string, string> customerDictionary = new Dictionary<string, string>();
foreach (DataRow row in customerTbl.Rows)
{
if(row["CustomerId"] != null && customerDictionay.ContainsKey("CustomerId") == false)
{
customerDictionary.Add(row["CustomerID"].ToString(), row["CompanyName"] as string);
}
}
答案 2 :(得分:0)
只是一个问题,将值放入字典有什么好处?您基本上只是在访问值时无需编写.ToString(),即代替:
row["CustomerID"].ToString();
你写了
customerDictionary["CustomerID"];
或者我错过了什么?