[英]Add columnname and data from datatable to a dictionary? C#
我正在遍历数据表,目前正在
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 ||依此类推不是很好。
您是否正在寻找这种事情的通用解决方案? 如果是这样,您的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复制到Dictionary。
编辑:根据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;
}
}
在测试数据中,第二行不匹配。 因此,它应该落入注释中的条件://列值不相同。
就个人而言,我将在数据库本身中进行此操作。
尝试这个。
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);
}
}
只是一个问题,将值放入字典有什么好处? 您基本上只是在访问值时消除了编写.ToString()的需要...即,而不是:
row["CustomerID"].ToString();
你写
customerDictionary["CustomerID"];
还是我错过了什么?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.