2016-11-08 2 views
0

у меня есть это очень простой Linq запрос (функция .dump() используется с LINQPad для того, чтобы просмотреть результаты):Добавить элемент списка на основе Условный с Linq Expression

void Main() 
{ 
    var myList = new List<string> 
    { 
     "One", "Two", "Three" 
    }; 


    var result = from o in myList 
    select o; 

    result.Dump(); 
} 

Как можно впрыснуть оператор if в запрос Linq, который заполняет result, чтобы он проверял, есть ли в списке «Четыре», а если нет, то добавьте его? Я понимаю, что есть способы сделать это, посмотрев результат после того, как Linq заполнил result, но я хотел бы добавить эту логику в один запрос Linq.

спасибо.

EDIT/CLARIFICATION: логика «if» должна быть внутри запроса Linq. Вот скелетной код:

var result = from o in myList 
    select o 
    [now add "four" if and only if it is not in the result] 
    [now end the query and ensure `result` contains "one", "two", "three", and "four"]; 

ВТОРОЙ EDIT: Я пытаюсь запроса и добавить в список в одной операции. Кстати, я сделал этот очень простой пример вместо того, чтобы дать гораздо более сложный сценарий, который я пытаюсь обработать, между прочим, так что это не так, как будто я борюсь с тем, как добавить новый элемент в объект List. :)

Так вот что я собирался сделать:

// запросить список, чтобы увидеть, если «четыре» в списке (запрос Linq идет здесь, чтобы проверить на «четыре»)

// если результат выше ложно затем добавить «четыре» в MyArray Список (добавить новый элемент массива здесь)

Вместо этого, я хотел бы сделать следующее:

// запросить список для его содержимого и als o добавить «четыре», если их нет в списке. // все это нужно сделать в одном «выбрать», используя Linq

Это невозможно?

спасибо.

+1

Что заставляет вас думать, что список будет запрошен дважды? Выражения LINQ являются декларативными, а не логикой выполнения. –

+0

Пересмотрено после вашего комментария. На самом деле, делая этот простой пример, я думаю, что создаю путаницу. Моя «более сложная» реальная проблема Linq будет проходить через список дважды, если у него есть вложенные выборки. Однако я не хочу вникать в эту сложность в этом вопросе, поэтому я пересмотрел свой ОП. Благодарю. – Jazimov

ответ

2

Вы можете использовать Union при переходе на метод синтаксис:

var result = myList.Union(new [] {"Four"}); 

Нет на самом деле чистого пути к нему, используя только синтаксис запроса. Синтаксис запроса поддерживает только небольшой набор операторов Linq, из которых union не один.

+0

Я не являюсь частью синтаксиса запроса. То, что я хочу увидеть, - это проверка того, находится ли в списке «четыре», а если нет, добавьте его. Это делается с подзапросом в запросе Linq? Где ваш условный тест? – Jazimov

+2

@Jazimov 'Union' делает это по определению. Это набор «union» из двух коллекций, который по определению не включает элементы в оба списка дважды. –

+1

У вас нет оператора _if_, если это то, что вы ищете. Я предполагаю, что вы могли бы сделать '.Concat (new [] {" four "}). Где (s =>! MyList.Contains (s))', но это фактически то же самое, что и 'Union'. –

3

Вы можете создать второй список элементов, которые вы хотите условно добавить, а затем объединить методы Except и Concat:

var myList = new List<string> 
{ 
    "One", "Two", "Three" 
}; 

var others = new List<string> { 
    "Four" 
}; 

var result = myList.Concat(others.Except(myList)); 

result.Dump(); 
+0

См. Пояснение, о котором идет речь. Мне нужна условная логика внутри одной конструкции Linq. Благодарю. – Jazimov

+0

@Jazimov Вы хотите сказать, что хотите использовать синтаксис запроса? Или использовать только один вызов метода? –

+0

Я дал скелетный пример. Полагаю, я бы ответил, что хочу использовать синтаксис запроса против одного вызова метода. Благодарю. – Jazimov