Сравните два набора данных и узнайте, какая строка отличается

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 будет позже использовать это сравнение. Я хотел бы рассказать пользователю: Извините, но данные: nameTT с идентификатором: RT14 - это недопустимые данные и выход из любых идей? Благодарю!

  • 0
    Почему вы сравниваете каждый ряд с каждым рядом? Я думаю, что вы должны просто сравнить пары
  • 0
    Намек; вместо того , чтобы немедленно возвращается ошибка, вы должны вернуться , когда is совпадение. Вы можете вернуть ошибку, если дойдете до конца и совпадений нет.
Показать ещё 4 комментария
Теги:
linq
loops
compare
dataset

3 ответа

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


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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню