我的应用程序中有许多这样的代码示例:
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);
}
}
答案 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);
}
}