2016-12-31 5 views
1

は、次の内容の交流#List<string> filesを考えてみましょう、私は今、同じファイル名を持つすべてのファイルを検索し、リストをバック受信したいC#で一覧<string>でサブストリングの一致に基づいて新しいリスト<string>を生成

C:\z1\z1.docx 
C:\z1\z2.docx 
C:\z2\z2.docx // <--- file z2.docx has the same name as in folder z1. 

ましたフルパス+ファイル名が含まれてい

List<string> duplicates

C:\z1\z2.docx 
C:\z2\z2.docx 

ループやその他の非効率的な方法でソリューションをコーディングするのは簡単ですが、私は洗練されたソリューションを使用したいと思いますし、C#でのList-operationsの知識は十分ではありません。

+1

「LINQ」を使用する – ViVi

答えて

4

私はあなたのもののループが非効率であるとは思っていません。それはLINQがとにかくカバーの下で行うことです。

var result = files.GroupBy(p => Path.GetFileName(p)) 
        .Where(g => g.Count() > 1) 
        .SelectMany(g => g); 

それは最初のファイル名でグループ、唯一の1要素ですべてのグループを破棄して、単一のコレクションに残りのグループを平らにします:あなたはLINQを使用したい場合しかし、あなたは、メソッドのカップルを使用して呼び出すことを達成することができますパスの

SelectManyの後にToListコールを追加して、結果をList<string>に具体化することができます。

+1

Downvotersはコメントしますか?これは、サンプルの入出力に基づいてオペレータが期待するものを正確に返します。 – MarcinJuraszek

2
List<string> duplicates = new List<string>() { @"C:\z1\z1.docx", 
              @"C:\z1\z2.docx", @"C:\z2\z2.docx" }; 
     List<dynamic> GetList(List<string> FilesToCheck) 
     { 
      var Files = from file in FilesToCheck 
         where duplicates.Contains(file) 
         select new { FileName = new FileInfo(file).Name, FullName  
         = new FileInfo(file).FullName }; 
      return Files.ToList(); 
     } 
+0

'duplicates.Contains(file)'は常に真です。なぜなら 'file'は' duplicates'から取り出されてから始まるからです。 – MarcinJuraszek

+0

提供されたリストに含まれているファイルは真です。これは彼が求めているものであり、エレガントでもあります。あなたの解決策も良いです。 –

+1

申し訳ありませんが、私はあなたが私を誤解したと思います。リスト内の要素を繰り返し処理し、後でその要素が同じ**リストに存在するかどうかをチェックするので、**常に**真となります。あなたはちょうどそれをリストの形にしたので、それはそこになければなりません... – MarcinJuraszek

関連する問題