【问题标题】:Compare two datasets and get which row is different比较两个数据集并获取哪一行不同
【发布时间】:2015-01-02 23:55:33
【问题描述】:

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

但它不起作用,因为该行稍后会进行此比较。我想告诉用户:对不起,id:RT14 的 data:nameTT 不是有效数据并退出 有任何想法吗?谢谢!

【问题讨论】:

  • 你为什么要比较每一行和每一行?我认为你应该只比较对
  • 提示;而不是立即返回错误,您应该在is 匹配时返回。如果到最后没有匹配,则可以返回错误。
  • 是的,我想比较配对。我现在想知道哪一对不是正确的。当我得到一对不正确时,我返回错误并完成
  • 你能像这样访问行吗?:dataset1.Tables[0].Rows[0]
  • 您还有问题吗?这些帖子中的任何一个对您有帮助吗?如果您自己解决了问题,请发表您的答案:)

标签: c# linq loops dataset compare


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      在这种情况下,我使用 Linq to XML。嗯,注意有些地方我应该检查 null 但我没有

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-06-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-05
        • 2011-07-30
        • 1970-01-01
        相关资源
        最近更新 更多