C #: как изящно передать несколько условий в Equals () - PullRequest
1 голос
/ 02 января 2011

Я новичок в 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 ]

2 голосов
/ 02 января 2011

Ааа, просто побью меня

var extentions = new List<string>() {".jpg", "gif"};
var files = new List<FileInfo>(); 
var result2 = files.Where(f => extentions.Contains(f.Extension)); 
2 голосов
/ 02 января 2011

Возможно 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 голос
/ 02 января 2011

Не нужно вводить метод расширения, он все равно встроен в 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

Вы даже можете сделать это (по крайней мере, как проверено наМоно, я сейчас в Моно):

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

Вот как это объясняет Роб Конери: http://blog.wekeroad.com/2008/02/27/creating-in-queries-with-linq-to-sql/

1 голос
/ 02 января 2011

Реализуйте свой собственный метод расширения следующим образом:

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