比较两个数据集,并得到该行不同
问题描述:
我有两个数据集: 1.-比较两个数据集,并得到该行不同
<dataset1>
<articles>
<name>name1</name>
<id>R12</id>
</articles>
<articles>
<name>name2</name>
<id>R13</id>
</articles>
<articles>
<name>name3</name>
<id>R14</id>
</articles>
<articles>
<name>name4</name>
<id>R15</id>
</articles>
<articles>
<name>name5</name>
<id>R16</id>
</articles>
<articles>
<name>name6</name>
<id>R17</id>
</articles>
<articles>
<name>name7</name>
<id>R18</id>
</articles>
<articles>
<name>name8</name>
<id>R19</id>
</articles>
</dataset>
2.
<dataset2>
<articles>
<name>name1</name>
<id>R12</id>
</articles>
<articles>
<name>name2</name>
<id>R13</id>
</articles>
<articles>
<name>nameTT</name>
<id>R14</id>
</articles>
<articles>
<name>name3</name>
<id>R20</id>
</articles>
</dataset>
第一个数据集是主数据集,第二个是来自用户。我想比较并知道第二个数据是否存在于第一个数据中。 因此,在这种情况下,第二个数据集的数据,前2行是正常的,但最后2行不正确,因为这些行不在第一行。 我曾尝试循环2数据集是这样的:
foreach (DataRow data1 in dataset1.Tables[0].Rows)//
{
foreach (DataRow data2 in data2.Tables[0].Rows)
{
if (!(data1["id"] == data2["id"] && data1["name"] == data2["name"]))
{
return "error";
}
}
}
但它不工作,因为该行colud晚TAHN这种比较。我想告诉用户:对不起,但数据:nameTT与ID:RT14是不是有效的数据和退出 任何想法?谢谢!
答
我假设两个数据集都有相同的行数。你可以检查自己的计数是否不同。
for (int i=0; i < dataset1.Tables[0].Rows.Count(); i++)
{
if (!(dataset1.Tables[0].Rows[i]["id"] == dataset2.Tables[0].Rows[i]["id"]
&& dataset1.Tables[0].Rows[i]["name"] == dataset2.Tables[0].Rows[i]["name"]))
{
return i;
}
}
我在这里返回不匹配的行的索引。您可以返回负数以指示所有行都匹配。
它只适用于两个数据集具有相同长度。你可以像下面这样遍历两个集合的最小长度:
for (int i=0; i < Math.Min(dataset1.Tables[0].Rows.Count(),dataset1.Tables[0].Rows.Count()); i++)
答
LINQ怎么样?
DataSet dataSet = new DataSet();
DataTable dataTable = new DataTable("articles");
dataTable.Columns.Add("name", typeof(string));
dataTable.Columns.Add("id", typeof(string));
dataSet.Tables.Add(dataTable);
string xmlData = "<XmlDS><articles><name>name1</name><id>R12</id></articles><articles><name>name2</name><id>R13</id></articles><articles><name>name3</name><id>R14</id></articles><articles><name>name4</name><id>R15</id></articles><articles><name>name5</name><id>R16</id></articles><articles><name>name6</name><id>R17</id></articles><articles><name>name7</name><id>R18</id></articles><articles><name>name8</name><id>R19</id></articles></XmlDS>";
System.IO.StringReader xmlSR = new System.IO.StringReader(xmlData);
dataSet.ReadXml(xmlSR, XmlReadMode.IgnoreSchema);
DataSet dataSet2 = new DataSet();
DataTable dataTable2 = new DataTable("articles");
dataTable2.Columns.Add("name", typeof(string));
dataTable2.Columns.Add("id", typeof(string));
dataSet2.Tables.Add(dataTable2);
string xmlData2 = "<XmlDS><articles><name>name1</name><id>R12</id></articles><articles><name>name2</name><id>R13</id></articles><articles><name>nameTT</name><id>R14</id></articles><articles><name>name3</name><id>R20</id></articles></XmlDS>";
System.IO.StringReader xmlSR2 = new System.IO.StringReader(xmlData2);
dataSet2.ReadXml(xmlSR2, XmlReadMode.IgnoreSchema);
var d1 = dataSet.Tables[0].AsEnumerable();
var d2 = dataSet2.Tables[0].AsEnumerable();
var result = d1.Where(a => d2.All(dt => (string)dt["id"] != (string)a["id"] || (string)dt["name"] != (string)a["name"])).ToList();
答
我在这种情况下使用Linq to XML。嗯请注意,可能有地方我应该检查空,但我没有
var dataSet1 = Your First XML DataSet
var dataSet2 = Your Second XML DataSet
XElement dataSet1Tree = XElement.Parse(dataSet1);
var dataSet1List = from el in dataSet1Tree.Elements("articles")
select new
{
Name = el.Elements("name").First().Value,
ID = el.Elements("id").First().Value
};
XElement dataSet2Tree = XElement.Parse(dataSet2);
var dataSet2List = from el in dataSet2Tree.Elements("articles")
select new
{
Name = el.Elements("name").First().Value,
ID = el.Elements("id").First().Value
};
foreach(var set2 in dataSet2List)
{
if (dataSet1List.FirstOrDefault(x=> x.Name == set2.Name && x.ID == set2.ID) == null)
Console.WriteLine("Invalid article : "+set2.ID+" "+set2.Name);
}
}
为什么你比较每一行与每一行?我想你应该比较一下 – 2014-11-06 13:08:31
的提示;而不是立即返回一个错误,你应该返回匹配的时候。如果到最后并且没有匹配,则可以返回错误。 – Rob 2014-11-06 13:08:50
是的,我想比较一下。 我想现在哪对不是正确的。当我得到一个不正确的对时,我返回错误并完成 – Za7pi 2014-11-06 13:13:04