2014-11-06 1 views
1

У меня два набора данных: 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 с идентификатором: RT14 недействительными данными и выходом Любые идеи? Благодаря!

+0

Почему вы сравниваете каждую строку с каждой строкой? Я думаю, вам нужно просто сравнить пары –

+0

Подсказка; вместо того, чтобы немедленно возвращать ошибку, вы должны вернуться, когда есть совпадение. Вы можете вернуть ошибку, если дойдете до конца, и нет совпадения. – Rob

+0

Да, я хочу сравнить пары. И я хочу, чтобы теперь какая пара не была правильной. Когда я получаю одну пару, которая неверна, я возвращаю ошибку и заканчиваю – Za7pi

ответ

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

В этом случае я использую Linq для XML в этом случае. Hmm Обратите внимание, что есть, вероятно, места, где я должен проверять значение 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); 
} 


}