Эффективно сравнивая два списка - PullRequest
0 голосов
/ 18 февраля 2020

Итак, у меня есть этот блок кода в моем приложении, который сканирует каталог для файлов, составляет список с ними и сравнивает этот список со списком файлов из базы данных (если путь к этому каталогу существует в БД) и добавляет разницу между ними в один из двух других списков. Вот оно:

 if (id > 0)
                {

                    var dbDrawingList = mdl_drawing.GetDrawingsByBaseId(id);
                    var counter = 0;

                    if (dbDrawingList.Count() < serverDrawingList.Count())
                    {
                        counter = serverDrawingList.Count();
                    }
                    else
                    {
                        counter = dbDrawingList.Count();
                    }

                    for (int i = 0; i <= counter; i++)
                    {

                        if (i < serverDrawingList.Count())
                        {
                            if (dbDrawingList.Select(f => f.partNumber).Contains(serverDrawingList[i].partNumber) == false)
                            {
                                onServerAndNotDb.Add(serverDrawingList[i]);
                            }
                        }

                        if (i < dbDrawingList.Count())
                        {
                            if (serverDrawingList.Select(f => f.partNumber).Contains(dbDrawingList[i].partNumber) == false)
                            {
                                onDbAndNotServer.Add(dbDrawingList[i]);
                            }
                        }
                    }
                    serverDrawingList = null;
                    dbDrawingList = null;
                }

У кого-нибудь есть лучший способ сделать это? (может быть несколько файлов с одинаковым именем, поэтому Except метод не работает)

1 Ответ

0 голосов
/ 18 февраля 2020

У меня есть один метод, который делает именно это, так я его реализовал, и пока он работает:

private void deleteRegistersFromFilesThatWasRemoved(string path)
{
    // add local files to list
    List<string> allFiles = new List<string>();
    string[] dirs = Directory.GetDirectories(path, "*", 
    SearchOption.TopDirectoryOnly);
    foreach (var dir in dirs)
    {
        string[] files = Directory.GetFiles(dir, "*", SearchOption.TopDirectoryOnly);
        foreach (var file in files)
        {
                if(file != path)
                {
                    allFiles.Add(file);
                }
            }
        }

        // list for file records in the database
        List<string> record = new List<string>();
        string queryfiles = //your query
        SqlCommand cmd = new SqlCommand(queryfiles, connection);
        cmd.Connection.Open();
        cmd.ExecuteNonQuery();
        SqlDataReader read = cmd.ExecuteReader();
        while (read.Read())
        {
         // I have path and file name separated that's why here's a string sum
            string r = read[2].ToString() + read[1].ToString();
            record.Add(r);

        }
        cmd.Connection.Close();

        for (int i = 0; i < record.Count; i++)
        {
            if (!allFiles.Contains(record[i]))
            {
                // do something if the record on the database is not in the local 
                //files list
            }
        }

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