2014-11-06 3 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 세트 반복 시도 :

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

을하지만 행 이상이어야 이러한 비교를 tahn colud 있기 때문에 작동하지 않습니다. 사용자에게 알려 드리고 싶습니다. 미안하지만 데이터 : nameTT와 ID : RT14가 유효하지 않으며 종료됩니다. 아이디어가 있습니까? 감사!

+0

왜 당신이 모든 행과 모든 행을 비교하는하지 않은 참고? 나는 당신이 단지 쌍을 비교해야한다고 생각한다. –

+0

힌트; 오류를 즉시 반환하는 대신 일치하는 경우 'is'가 반환되어야합니다. 끝나고 일치하는 항목이 없으면 오류를 반환 할 수 있습니다. – 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 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); 
} 


} 
관련 문제