C#:如何优雅地将多个条件传递给Equals()

时间:2011-01-02 07:33:51

标签: c# equals

我是C#的新手,我正在尝试编写一个从FileInfo列表中选择文件类型的程序。 到目前为止,我有以下几点:

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

显然我对这个解决方案不满意,但我不知道如何在一次通话中这样做。

最好的方法是什么?

4 个答案:

答案 0 :(得分:2)

啊,只会打败我

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

答案 1 :(得分: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);

答案 2 :(得分: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));
    }
}

答案 3 :(得分:1)

无需引入扩展方法,无论如何它都内置在Linq中:

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

你甚至可以这样做(至少在Mono上测试过,我现在在Mono中):

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

以下是Rob Conery的解释:http://blog.wekeroad.com/2008/02/27/creating-in-queries-with-linq-to-sql/