2011-01-02 16 views
1

私はC#を初めて使用しています.FileInfoリストからファイルタイプを選択するプログラムを作成しようとしています。 は、これまでのところ私は、の線に沿って何かを持っている:C#:複数の条件をEquals()に正常に渡す方法

List<FileInfo> files = new List<FileInfo>(); 
    IEnumerable<FileInfo> result = files.Where(f=>f.Extension.Equals(".jpg", StringComparison.InvariantCultureIgnoreCase)|| 
    f.Extension.Equals(".gif", StringComparison.InvariantCultureIgnoreCase)); 

など

もちろん、私は、このソリューションに満足しないんだけど、私は、単一の呼び出しでそれ以外の場合は、これを行う方法を知りません。

どうすればいいですか?

答えて

2

おそらくEnumerable.Containsを負かす事になります。拡張子を最初に下(または上)のケースに正規化してください。

var source = ...; 
var accepted = new [] { ".foo", ".bar" }; 
var selected = source.Where(i => accepted.Contains(i.Extension.ToLowerCase())); 

編集は、私が実際に最近の暗黙的な方法・ツー・機能の変換を使用しましたので、私はそれを言及するように感じるん:

bool ValidExtension (FileInfo f) { 
    // do whatever logic here, perhaps use same technique as above 
} 
var selected = source.Where(ValidExtension); 
1

はそうのような独自の拡張メソッドを実装します。

class Program 
{ 
    static void Main(string[] args) 
    { 
     List<FileInfo> files = new List<FileInfo>(); 
     IEnumerable<FileInfo> result = files.Where(f => f.Extension.AnyOf(".jpg", ".gif")); 
    } 
} 

public static class Extensions 
{ 
    public static bool AnyOf(this string extension, params string[] allowed) 
    { 
     return allowed.Any(a=>a.Equals(extension)); 
    } 
} 
2

ああはちょうど私

var extentions = new List<string>() {".jpg", "gif"}; 
var files = new List<FileInfo>(); 
var result2 = files.Where(f => extentions.Contains(f.Extension)); 
+0

しかし、私はあなたの答えが好き; - :

IEnumerable<FileInfo> result = files.Where( f => new [] { ".jpg", ".png" }.Contains(f.Extension)); 

をここでロブConeryがそれを説明する方法です) –

1

拡張メソッドを導入する必要が、それが組み込まれていますとにかくLINQの中-in:

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

class Program 
{ 
    static void Main(string[] args) 
    { 
     List<FileInfo> files = new List<FileInfo>(); 
     files.Add(new FileInfo("OhNo.jpg")); 

     files.Add(new FileInfo("OhYes.jpg")); 

     files.Add(new FileInfo("OhMy.pcx")); 

     files.Add(new FileInfo("OhTrue.png")); 

     IEnumerable<FileInfo> result = files.Where(
      f => new string[] { ".jpg", ".png" }.Contains(f.Extension)); 

     foreach(var r in result) Console.WriteLine("{0}", r); 
    } 
} 

出力:

OhNo.jpg 
OhYes.jpg 
OhTrue.png 

あなたも、この(モノラルでテストされ、少なくともとして、私は今、モノラルでよ)行うことができます。http://blog.wekeroad.com/2008/02/27/creating-in-queries-with-linq-to-sql/

+0

私が探していた構文とよく似ています。ありがとう! – Roy

+0

最適なソリューション。エレガントでシンプルで読みやすい。 –

関連する問題