有效比较两个列表

时间:2020-02-18 16:46:28

标签: c# .net list

所以,我在我的应用程序上有这段代码块,它可以扫描目录中的文件,并与之建立一个列表,并将该列表与数据库中文件的列表进行比较(如果该目录的路径在db中存在)并将它们之间的差异添加到其他两个列表之一。在这里是:

 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 :(得分:-1)

我有一个方法可以做到这一点,这就是我实现它的方式,并且到目前为止它一直在起作用:

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

    }
}