Цикл по таблицам данных Выбор данных C # - PullRequest
0 голосов
/ 14 февраля 2019

Ниже приведен некоторый код, который выводит пакет из нескольких файлов XML и добавляет их в свою собственную таблицу данных в наборе данных:

    private void Btn_Import_Click(object sender, RoutedEventArgs e)
    {

        /*ILRChecks.ILRReport.NullChecks();
        ILRChecks.ILRReport.CrossYear();*/

        DataSet dataSet = new DataSet();
        DataTable diff = new DataTable();
        diff.TableName = "Differences";

        diff.Columns.Add("LearnRefNumber");
        diff.Columns.Add("ULN");
        //diff.Columns.Add("FamilyName");
        //diff.Columns.Add("GivenNames");
        diff.Columns.Add("DateofBirth");
        diff.Columns.Add("NINumber");
        diff.Columns.Add("Message");

        Dictionary<int,DataTable> Tables = new Dictionary<int,DataTable>();


        foreach (string str_FileLocation in Global.fileNames)
        {
            FileInfo fileInfo = new FileInfo(str_FileLocation);
            string str_xmlFileName = fileInfo.Name;

            XDocument doc = XDocument.Load(str_FileLocation);

            var ns = doc.Root.GetDefaultNamespace();
            var learner = doc.Descendants(ns + "Learner");

            string shortfile = str_xmlFileName.Substring(13,4);

            StringReader reader = new StringReader(new XElement("Sample", learner).ToString());

            DataSet ds = new DataSet();
            ds.ReadXml(reader);

            Tables.Add(int.Parse(shortfile), ds.Tables[0]);

            DataTable dt = ds.Tables[0].Copy();
            dt.TableName = shortfile;

            dataSet.Tables.Add(dt);
        }

Затем я хочу иметь возможность выполнить циклчерез каждый из этих наборов данных, сравнивая их, в порядке имени таблицы данных.Имена были преобразованы в целые числа и должны начинаться в последний год, то есть 1819, затем 1718 и так далее, в зависимости от того, сколько файлов существует.Я полагаю, что у меня есть рабочий оператор foreach, позволяющий циклу правильно определять порядок таблиц и помещать их в таблицу текущих элементов:

        foreach (var item in Tables.OrderByDescending(k => k.Key))
        {

            if (item.Key != Tables.OrderByDescending(k => k.Key).Last().Key)
            {
                DataTable dataTable_CurrentItem = item.Value;


            }

            }

Затем у меня есть часть кода, которая работает автономно, но мне нужно включить это в вышеприведенное как часть цикла, сравнивая файлы по мере прохождения, но я подозреваю, что эта часть не совсем правильная, и следует ли ей идти в приведенном выше утверждении foreach, я 'я не уверен:

       var diff_ULNDOB = from Latest in dataSet.Tables["1819"].AsEnumerable()
                                 join previous in dataSet.Tables["1718"].AsEnumerable()
                                 on Latest.Field<string>("ULN") equals previous.Field<string>("ULN")
                                 where Latest.Field<string>("DateofBirth") != previous.Field<string>("DateofBirth")
                                 select new { ULN = Latest.Field<string>("ULN"), FamilyName = Latest.Field<string>("FamilyName") };

        if (diff_ULNDOB.Any())
        {.
            MessageBox.Show("PROBLEM!!!!!!");
        }

1 Ответ

0 голосов
/ 14 февраля 2019

См. Изменения ниже.Вам не нужно использовать DataSet.Вы можете использовать только DataTable.:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Data;
using System.Threading.Tasks;

namespace ConsoleApplication100
{

    class Program
    {

        static void Main(string[] args)
        {

        }


    }
    public class test
    {
        private void Btn_Import_Click(object sender, RoutedEventArgs e)
        {

            /*ILRChecks.ILRReport.NullChecks();
            ILRChecks.ILRReport.CrossYear();*/

            DataSet dataSet = new DataSet();
            DataTable diff = new DataTable();
            diff.TableName = "Differences";

            diff.Columns.Add("LearnRefNumber");
            diff.Columns.Add("ULN");
            //diff.Columns.Add("FamilyName");
            //diff.Columns.Add("GivenNames");
            diff.Columns.Add("DateofBirth");
            diff.Columns.Add("NINumber");
            diff.Columns.Add("Message");

            Dictionary<int, DataTable> Tables = new Dictionary<int, DataTable>();

            foreach (string str_FileLocation in Global.fileNames)
            {
                FileInfo fileInfo = new FileInfo(str_FileLocation);
                string str_xmlFileName = fileInfo.Name;

                XDocument doc = XDocument.Load(str_FileLocation);

                var ns = doc.Root.GetDefaultNamespace();
                var learner = doc.Descendants(ns + "Learner");

                string shortfile = str_xmlFileName.Substring(13, 4);

                StringReader reader = new StringReader(new XElement("Sample", learner).ToString());

                DataTable dt = new DataTable();

                dt.ReadXml(reader);

                Tables.Add(int.Parse(shortfile), dt);
            }
            var orderTables = Tables.OrderByDescending(k => k.Key).ToList();
            for (int i = 1; i <= orderTables.Count(); i--)
            {

                var diff_ULNDOB = from Latest in orderTables[i].AsEnumerable()
                                join previous in orderTables[i - 1].AsEnumerable()
                                on Latest.Field<string>("ULN") equals previous.Field<string>("ULN")
                                where Latest.Field<string>("DateofBirth") != previous.Field<string>("DateofBirth")
                                select new { ULN = Latest.Field<string>("ULN"), FamilyName = Latest.Field<string>("FamilyName") };

            }


        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...