В моем приложении есть множество примеров такого кода:

   foreach (var setting in vm.PTI)
   {
     if (setting.Name == name)
     {
        setting.IsSelected = true;
        App.DB.UpdateIntSetting(SET.Pti, setting.Id);
     }
     else
        setting.IsSelected = false;
   }

Циклы, которые проходят через массив, выбирают одну соответствующую строку и затем устанавливают свойства в массиве.

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

Вот используемый класс:

    ParamViewModel[] _pti;
    public ParamViewModel[] PTI
    {
        get => _pti;
        set => SetProperty(ref _pti, value);
    }

public class ParamViewModel: BaseViewModel
{

    int _id;
    public int Id
    {
        get => _id;
        set => SetProperty(ref _id, value);
    }

    string _name;
    public string Name
    {
        get => _name;
        set => SetProperty(ref _name, value);
    }

    bool _isSelected;
    public bool IsSelected
    {
        get => _isSelected;
        set => SetProperty(ref _isSelected, value);
    }

}
c#
3
Alan2 8 Окт 2018 в 07:55

2 ответа

Лучший ответ

Для вашего конкретного случая вы можете написать метод расширения:

    public static void ModifyCollection<T>(this IEnumerable<T> source, Predicate<T> selectedPredicate,Action<T> selectedAction, Action<T> othersAction=null)
    {
        if (selectedPredicate == null) throw new ArgumentNullException(nameof(selectedPredicate));
        if (selectedAction == null) throw new ArgumentNullException(nameof(selectedAction));
        foreach (var element in source)
        {
            if (selectedPredicate(element))
            {
                selectedAction(element);
            }
            else
            {
                othersAction?.Invoke(element);                    
            }
        }
    }

Как это использовать:

PTI.ModifyCollection(
      selectedPredicate:(s) => s.Name == name,
      selectedAction:(s) => 
           { 
             s.IsSelected = true; 
             App.DB.UpdateIntSetting(SET.Pti, setting.Id); 
           },
      othersAction:(s) => s.IsSelected = false);

Вы можете пойти дальше и указать ограничения на T. 'где T - INamed' и поместите код предиката в метод расширения.

Вы можете написать свой собственный метод расширения:

public static void ForEach<T>(this IEnumerable<T> source, Action<T> action)
{
    if (source == null) throw new ArgumentNullException("source");
    if (action == null) throw new ArgumentNullException("action");
    foreach (var element in source)
    {
        action(element);
    }
}
1
Access Denied 8 Окт 2018 в 10:34

Вы можете сначала получить настройку с помощью LINQ, а затем установить ее.

var setting = vm.PTI.FirstOrDefault( s => s.Name == name );
if (setting != null)
{
    setting.IsSelected = true;
    App.DBUpdateIntSetting(SET.Pti, setting.Id);
}
1
Sinan BARAN 8 Окт 2018 в 06:40