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

发布于 2024-10-09 20:07:35 字数 437 浏览 0 评论 0原文

我是 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) );

显然我对这个解决方案不满意,但我不知道如何在一次调用中做到这一点。

更好的方法是什么?

I'm new to C#, and I'm trying to write a program that selects file types from a FileInfo list.
So far I have something along the lines of:

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

etc

Obviously I'm not happy with this solution, but I don't know how to do this otherwise in a single call.

What's the better way to go about it?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

肩上的翅膀 2024-10-16 20:07:35

也许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);

Perhaps Enumerable.Contains. Just normalize the extension to lower (or upper) case first.

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

Edit, I've actually used the implicit method-to-function conversions recently, so I feel like mentioning it:

bool ValidExtension (FileInfo f) {
    // do whatever logic here, perhaps use same technique as above
}
var selected = source.Where(ValidExtension);
滥情空心 2024-10-16 20:07:35

啊 会打败我

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

Ahh Will just beat me

var extentions = new List<string>() {".jpg", "gif"};
var files = new List<FileInfo>(); 
var result2 = files.Where(f => extentions.Contains(f.Extension)); 
十二 2024-10-16 20:07:35

像这样实现你自己的扩展方法:

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));
    }
}

Implement your own extension method like so:

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));
    }
}
失眠症患者 2024-10-16 20:07:35

不需要引入扩展方法,无论如何它都是 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/使用 linq-to-sql 创建查询/

No need to introduce an extension method, it's built-in in Linq anyway:

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);
    }
}

Output:

OhNo.jpg
OhYes.jpg
OhTrue.png

You can even do this(at least as tested on Mono, I'm in Mono now):

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

Here's how Rob Conery explains it: http://blog.wekeroad.com/2008/02/27/creating-in-queries-with-linq-to-sql/

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文