自定义列表和字符串列表之间的区别

时间:2019-01-23 12:02:22

标签: c# linq

我有2个列表,第一个是用Route::get('/subcategory/{category}', 'FrontController@subCategory'); 方法填充的字符串列表,第二个是自定义列表。我的自定义列表中只有2个字段。第一个是Directory.GetFiles(),第二个是FilePath。 我想要实现的是,我想将字符串列表与自定义列表的UniqueID字段进行比较。我需要进行更改。

我已将“自定义”列表转换为字符串,并尝试了此解决方案 Difference between two lists 它运行完美,但对我而言对我来说毫无用处。我需要比较不同类型的列表

这是我用作模型的自定义类

FilePath

这就是我已经尝试过的方式

public class IndexerListModel
{
    public string FilePath = string.Empty;
    public string uniqueID = string.Empty;
}

但是因为我没有在列表中使用相同的类型,所以它不起作用。

我希望能像新列表一样获得与众不同,该新列表向我显示列表中的这些“ x”项具有不同的文件路径。

我的总体目标是在应用程序启动时在Windows文件夹中进行更改。因此,我将知道我的应用程序未启动时已添加/删除/更改/重命名了哪些文件

3 个答案:

答案 0 :(得分:2)

如果我正确理解问题,则定制<List<IndexerListModel>将包含目录Eg C:\Windows的内容。

然后,在应用程序启动时,我们将使用var myPathList = Directory.GetFiles(@"C:\Windows").ToList();来检索C:\Windows的内容。

结果将是自定义<List<IndexerListModel>

中未包含的路径列表

如果以上假设正确,我想出了以下解决方案:

public class IndexerListModel
{
    public string UniqueID { get; set; }
    public string FilePath { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        var myPathList = Directory.GetFiles(@"C:\Windows").ToList();

        List<IndexerListModel> myModelList = new List<IndexerListModel> {
            new IndexerListModel {
            UniqueID= "0001",
            FilePath = @"C:\Windows\bfsvc.exe"
        },
            new IndexerListModel {
            UniqueID= "0002",
            FilePath = @"C:\Windows\diagwrn.xml"
        }
        };

        var result = myPathList.Where(path => !myModelList.Any(model => model.FilePath == path)).ToList();
    }
}

运行该应用程序时,我的C:\Windows中总共有27个文件。 -结果将评估为25个项目的清单。这意味着自上次执行以来,总共添加了25个文件。

我们可以更新List myModelList以便反映C:\Windows中的更改。我可以想象myModelList被保存在数据库或文件中以便持久化。

答案 1 :(得分:0)

使用左外部联接

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;


namespace ConsoleApplication98
{
    class Program
    {
        static void Main(string[] args)
        {
            List<string> WinFileList = Directory.GetFiles("AllDirectories[i]", ".", SearchOption.AllDirectories).ToList();
            List<IndexerListModel> models = new List<IndexerListModel>();

            //use left outer join
            var results = (from w in WinFileList
                           join m in models on w equals m.FilePath into wm
                           from m in wm.DefaultIfEmpty()
                           select new { model = m, windFileList = w }).ToList();


        }
    }
    public class IndexerListModel : IEqualityComparer<IndexerListModel>
    {
        public string FilePath = string.Empty;
        public string uniqueID = string.Empty;
    }

}

答案 2 :(得分:0)

models.Except(models.Where(y=> strings.Contains(y.FilePath)));