比较两个数据集并获取哪个行不同

时间:2014-11-06 12:58:52

标签: c# linq loops dataset compare

我有两个数据集: 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个数据集:

 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";
                        }
                    }
                }

但它不起作用,因为行col在此比较之后才会发生。我想告诉用户:抱歉,但数据:nameTT的id:RT14是无效数据并退出 有任何想法吗?谢谢!

3 个答案:

答案 0 :(得分:0)

我假设两个数据集具有相同的行数。您可以自己检查计数是否不同。

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++)

答案 1 :(得分:0)

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();

答案 2 :(得分:0)

在这种情况下,我使用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);
}


}