2009-12-17 2 views
3

Представьте, что вы хотели бы выбрать все элементы одной последовательности all, за исключением элементов, содержащихся в последовательности exceptions и одного элемента otherException.Добавить один элемент в последовательность для выражения

Есть ли лучший способ сделать это, чем? Я хотел бы избежать создания нового массива, но не смог найти метод в последовательности, которая объединяет его с одним элементом.

all.Except(exceptions.Concat(new int[] { otherException })); 

полный исходный код для полноты ради:

var all = Enumerable.Range(1, 5); 
int[] exceptions = { 1, 3 }; 
int otherException = 2; 
var result = all.Except(exceptions.Concat(new int[] { otherException })); 

ответ

3

Альтернативы (возможно, более удобной для чтения) будет:

all.Except(exceptions).Except(new int[] { otherException }); 

Вы можете также создать метод расширения, который преобразует любой объект к IEnumerable, что делает код еще более удобочитаемым:

public static IEnumerable<T> ToEnumerable<T>(this T item) 
{ 
    return new T[] { item }; 
} 

all.Except(exceptions).Except(otherException.ToEnumerable()); 

Или, если вы действительно хотите многоразовый способ легко получить коллекцию плюс один пункт:

public static IEnumerable<T> Plus<T>(this IEnumerable<T> collection, T item) 
{ 
    return collection.Concat(new T[] { item }); 
} 

all.Except(exceptions.Plus(otherException)) 
+0

да, методы расширения бы быть лучше пойти. – Axarydax