Используя условный оператор в лямбда-выражении в ForEach () в универсальном Списке?

Необходимо использовать System.IO.Path.GetTempFileName()

, Создает исключительно именованный, нулевой байт временный файл на диске и возвращает полный путь того файла.

можно использовать System.IO.Path.GetDirectoryName(System.IO.Path.GetTempFileName()) для получения только временной информации папки, и создать папки там

Они создаются в папке временного файла окон, и это, рассматривают лучшую практику

10
задан Jamezor 29 November 2009 в 21:40
поделиться

4 ответа

Вы используете более короткую форму лямбда-выражений, которая допускает только одиночные выражения.
Вам нужна длинная форма, которая позволяет использовать несколько операторов.

Например:

items.ForEach(item => {
    if (item.Contains("I Care About")) 
        whatICareAbout += item + ", ";
});
30
ответ дан 3 December 2019 в 13:51
поделиться

Проблема заключалась в том, что выражение

item.Contains("I Care About") ? whatICareAbout += item + "," : whatICareAbout += ""

не является утверждением . Он просто возвращает значение типа string .

Есть трюк, чтобы заставить его работать (просто для удовольствия):

    items.ForEach(item => (item.Contains("I Care About") ?
    whatICareAbout += item + "," : whatICareAbout += "").GetType());

Я просто добавил вызов .GetType () ] для создания оператора из исходного выражения, и он скомпилирован.

4
ответ дан 3 December 2019 в 13:51
поделиться

Чего вы пытаетесь достичь? Вы пытаетесь сформировать строку элементов, разделенных запятыми, где они содержат определенное значение? В linq этого можно добиться, используя следующее:

 List<string> items = new List<string> { "Item 1", "Item 2", "Item I Care About", "Item I Care About", "Item I Care About" }; 
 string whatICareAbout = items.Where(x => x.Contains("I Care About"))
                              .Aggregate( (y, z) => y + ", " + z);

Результатом этого будет «Элемент, о котором я забочусь, элемент, о котором я забочусь, элемент, о котором я забочусь».

Примечание: Агрегирование - отличный способ убедиться, что нет конечный ","

5
ответ дан 3 December 2019 в 13:51
поделиться

Попробуйте заключить скобки:

items.ForEach(item => item.Contains("I Care About") ? (whatICareAbout += item + ",") : (whatICareAbout += "") );

+ = имеет более высокий приоритет, чем?, Возможно, поэтому вы получаете сообщение об ошибке. С помощью скобок ошибка может исчезнуть. Хотя не на 100% уверен в этом ... лямбда-выражения могут иметь дополнительные ограничения, которые не позволяют использовать операторы присваивания.

ОБНОВЛЕНИЕ:

Вместо нескольких операторов + = гораздо проще поместить условное выражение справа -ручная сторона присваивания, например:

List<string> items = new List<string> { "one", "two", "three" };
string whatICareAbout = "";
items.ForEach(item => whatICareAbout +=  item.Contains("I Care About") ? (item + ",") : ""); 

ОБНОВЛЕНИЕ 2:

Но даже лучше просто использовать Aggregate (), поскольку он разработан именно для этого сценария. Вот один пример:

string whatICareAbout = items.Aggregate("", (total, item) => item.Contains("I Care About") ? (total + item + ",") : total);

Но я думаю @Matt Breckon ' s ответ выше (который я только что видел, когда собирался опубликовать это) даже лучше, чем мой пример, поскольку он касается удаления терминала ",". Посмотрите на его ответ ...: -)

1
ответ дан 3 December 2019 в 13:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: