我是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) );
等
显然我对这个解决方案不满意,但我不知道如何在一次通话中这样做。
最好的方法是什么?
答案 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/