【问题标题】:Comparing an Arraylist with a list of classes c#将 Arraylist 与类 c# 的列表进行比较
【发布时间】:2017-01-25 19:24:19
【问题描述】:

我有一个数据库项目列表和一个文件列表。我试图找出数据库中缺少哪些文件。我将数据库读入一个列表 DBItems。我将文件读入另一个列表:

    List<DBFiles> DBItems = new List<DBFiles>();
    ArrayList FileArray =  Directory.GetFiles(@"C:\reports\", "*.rpt", SearchOption.AllDirectories);

    public class DBFiles
    {
        public DBFiles(string fileName, string flag)
        {
            this.FileName = fileName;
            this.Flag = flag;
        }
        public string FileName { set; get; }
        public string Flag { set; get; }
    }

我的问题是,如果 FileArray 中的每个项目都在带有特定标志的 DBFiles 中,我该如何查找。这是我目前所拥有的:

    private void ListCompare()
    {
        for (int i = 0; i < FileArray.Count; i++)
        {
            if (DBItems.FileName.Contains(FileArray[i]) && DBItems.Flag.Contains("A") )
                {
                }


        }
    }       

显然它不起作用。任何帮助将不胜感激。

【问题讨论】:

    标签: c# arrays arraylist


    【解决方案1】:

    尝试使用Linq:你想要Except目录中的所有文件DBItems中的文件:

       var result = Directory
         .EnumerateFiles(@"C:\reports\", "*.rpt", SearchOption.AllDirectories)
         .Except(DBItems
            .Where(item => item.Flag.Contains("A")) // add condition via Where in required
            .Select(item => item.FileName)
            ,StringComparer.OrdinalIgnoreCase)
         .ToArray(); // let's materialize into array
    

    附:尽量避免过时 ArrayList 类;把List&lt;T&gt;(在你的情况下是List&lt;string&gt;)改为。

    编辑:根据问题细化(见cmets)下面的条件更复杂。

    我正在寻找以 h9347 开头的文件(数据库仅定义 用于客户特定需求的文件名的第一部分

    在这种情况下,我建议创建一个 HashSet&lt;string&gt; 来排除要排除的内容,然后再次使用 Linq

    // File names in name.extension format to exclude 
    HashSet<string> toExclude = new HashSet<string>(DBItems
      .Where(item => item.Flag.Contains("A")
      .Select(item => item.FileName),
      StringComparer.OrdinalIgnoreCase);
    
    var result => Directory
      .EnumerateFiles(@"C:\reports\", "*.rpt", SearchOption.AllDirectories)
      .Where(file => Path.GetFileName(file).StartsWith("h9347") &&
                     !toExclude.Contains(Path.GetFileName(file)))
      .ToArray();
    

    【讨论】:

    • 谢谢。我改为 List。这几乎可以工作。请帮忙,因为我不擅长 LINQ。另一个标准是文件名不能在 DBItems 中。我正在获取目录中的所有文件。我正在寻找不在 DBItems.FileName 中的目录中的所有文件名。感谢您的帮助德米特里。
    • @Missy:DBItems.FileName 是否包含目录名?换句话说是DBItems.FileName 一个C:\MyText.txt 还是只是MyText.txt
    • 实际上,最终它将包含文件名的一部分,因此我正在寻找以 h9347 开头的文件(数据库仅定义文件名的第一部分以满足客户的特定需求)。没有路径。我修改了您的代码以更改此代码: Directory.EnumerateFiles(@"C:\reports\", "*.rpt", SearchOption.AllDirectories) 为 FileArray,因为我稍微按摩 FileArray 以消除重复项。那部分奏效了。
    • @Missy:在这种情况下,我建议创建应排除哪些文件名的HashSet&lt;string&gt; toExclude 集合;然后使用 LinqDirectory.EnumerateFiles 中过滤掉这些文件
    猜你喜欢
    • 2014-12-07
    • 1970-01-01
    • 2020-07-30
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    • 2017-06-10
    • 2018-11-12
    • 1970-01-01
    相关资源
    最近更新 更多