是否有另一种方法可以编码使用LINQ从多个循环中选择的循环?

时间:2018-10-08 04:55:28

标签: c#

我的应用程序中有许多这样的代码示例:

   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);
    }

}

2 个答案:

答案 0 :(得分:1)

您可以先使用LINQ进行设置,然后再进行设置。

var setting = vm.PTI.FirstOrDefault( s => s.Name == name );
if (setting != null)
{
    setting.IsSelected = true;
    App.DBUpdateIntSetting(SET.Pti, setting.Id);
}

答案 1 :(得分:1)

对于您的特殊情况,您可以编写扩展方法:

    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的constraints。“其中T被命名”,并将谓词代码放入扩展方法中。

您可以编写自己的扩展方法:

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);
    }
}