2017-01-25 12 views
0

私はデータベースアイテムのリストとファイルのリストを持っています。私は、どのファイルがデータベースにないかを調べようとしています。私はDBItemsのリストにデータベースを読んだ。私は別のリストにファイルを読み込む:Arraylistとクラスリストの比較c#

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している場合、私は見上げる行う方法です。これはこれまで私が持っているものです:

明らかに動作していません。どんな助力も心から感謝します。

答えて

2

LINQのを使用してみてください:あなたは、ディレクトリ内のすべてのファイルDBItemsExceptファイルをしたい:

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 

P.S. が廃止されるのを避けてください。ArrayListクラスです。代わりにList<T>(あなたの場合はList<string>)を入れてください。

編集:の質問によると、条件は下記のように洗練されています(コメントを参照)。

私は(データベースはこの場合、クライアント固有のニーズ

のファイル名だけ 最初の部分を定義して、私は何のHashSet<string>を作成示唆h9347で始まるファイルを探しています除外し、再度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(); 
+0

私はLINQが得意ではないですよう助けてください。これは、ほとんどの作品私が一覧表示するように変更していただきありがとうございます他のCRに。。。。 iteriaは、ファイル名がDBItemsに存在できないということです。私はディレクトリ内のすべてのファイルを取得しています。私は、DBItems.FileNameにないディレクトリ内のすべてのファイル名を取得しようとしています。ドミトリーのお手伝いをありがとうございます。 – Missy

+0

@Missy: 'DBItems.FileName'はinclude *ディレクトリ名*ですか?言い換えると、 'DBItems.FileName'は' C:\ MyText.txt'か単に 'MyText.txt'ですか? –

+0

実際には、最終的にファイル名の一部が含まれるので、h9347で始まるファイルを探しています(データベースは、クライアント固有のニーズに合わせてファイル名の最初の部分のみを定義します)。パスはありません。 FileArrayに重複を取り除くビットをマッサージするので、私はあなたのコードを変更するためにあなたのコードを修正しました:Directory.EnumerateFiles(@ "C:\ reports \"、 "* .rpt"、SearchOption.AllDirectories)その部分は働いた。 – Missy