Я хочу изменить данные в своем объекте с помощью Linq

#c# #linq

Вопрос:

 var todate = Filters.Where(it => it.Value == "ApplicationDateToSearch").Select(it =>
                {
                    if (DateTime.TryParse(it.Description, out DateTime ConvertedToDate))
                    {
                        it.Description = ConvertedToDate.AddHours(23).AddMinutes(59).AddSeconds(59).ToString();
                    }
                })?.FirstOrDefault();
 

Visual Studio, похоже, это не нравится.

 List<EmployeeRole> Filters

public class EmployeeRole
{         
    public String Description { get; set; }
    public String Value { get; set; }
    public int IntValue { get; set; } 
}
 

Комментарии:

1. LINQ расшифровывается как «языковой интегрированный запрос», что означает, что он предназначен для получения данных. Можете ли вы назвать какую-либо причину, по которой вы хотите использовать его для внесения изменений? Кроме того, List<T> реализует .ForEach метод, который вы могли бы использовать. В любом случае, «Visual Studio» это «не нравится», потому что ваша проекция ( .Select ) ничего не возвращает.

2. Определите «не нравится это». Ты забыл сделать return it; это после if ?

3. Кроме того, способ, которым вы добавляете часы, секунды и т. Д., Неверен (поскольку, например, он не будет обрабатывать один тик до полуночи). Не делай этого. Добавьте целый день и используйте < вместо <= этого .

4. В чем именно ваша проблема? Ваш selector не возвращает никакого значения. Компилятор не может построить это из-за неопределенного возвращаемого значения. Это никак не связано с изменением вашего экземпляра. return it; как и последняя строка в вашей лямбде, это должно сработать.

Ответ №1:

Оператор «select» используется для выбора свойств, которые вы не можете изменить в этом, поэтому для этого вам необходимо использовать оператор «ForEach». Но оператор ‘ForEach’ не имеет никакого возвращаемого типа, поэтому после этого вы можете использовать FirstOrDefault

 var x = Filters.Where(i => i.Value == "ApplicationDateToSearch").ToList();
x.ForEach(i => i.Description = DateTime.TryParse(i.Description, out DateTime ConvertedToDate) ?                             ConvertedToDate.AddHours(23).AddMinutes(59).AddSeconds(59).ToString() : string.Empty);
var todate = x.FirstOrDefault();
 

Комментарии:

1. «Если вы не хотите изменять существующий список, используйте вот так» — если вы имеете в виду сущности, то они будут изменены даже с использованием вашего примера кода.

2. Да, я согласен, что это изменит список данных, я изменю текст