我正在处理一些报告代码,我发现自己重复了一段代码,其中包含一个地方和一次又一次选择的原因?唯一改变的信息是目标领域。
private static void UpdateResultsListInstructions(List<ManagementInfo> managementInfo, KeyValuePair<int, int> item)
{
managementInfo
.Where(m => m.YearMonthNo == item.Key)
.Select(m => m.VolumeOfInstructionsReceivedInMonth = item.Value)
.ToList();
}
private static void UpdateResultsListClaims(List<ManagementInfo> managementInfo, KeyValuePair<int, int> item)
{
managementInfo
.Where(m => m.YearMonthNo == item.Key)
.Select(m => m.VolumeOfClaimsCancelled = item.Value)
.ToList();
}
是否可以将选择器作为参数传递,以便重用一个方法?
沿着
的路线UpdateCommonResultsList(managementInfo, item, (m => m.VolumeOfClaimsCancelled = item.Value))
我可以重新编写所有代码,这样就没有必要了,但现在我已经想到了我是否愿意看看它是否可行。任何帮助表示赞赏。
答案 0 :(得分:4)
虽然我不喜欢使用Select
来更新列表 - 但我误解了这个问题,因为这样做并不常见! - 你可以按如下方式进行:
private static void UpdateCommonResultsList(
List<ManagementInfo> managementInfo,
KeyValuePair<int, int> item,
Action<ManagementInfo, int> action)
{
managementInfo
.Where(m => m.YearMonthNo == item.Key)
.Select(m => { action(m, item.Value); return item.Value; })
.ToList();
}
呼叫
UpdateCommonResultsList(
managementInfo,
item,
(m, i) => m.VolumeOfClaimsCancelled = i);
如果您这样做,您的代码将更加传统
private static void UpdateCommonResultsList(
List<ManagementInfo> managementInfo,
KeyValuePair<int, int> item,
Action<ManagementInfo, int> action)
{
foreach (ManagementInfo m in managementInfo
.Where(m => m.YearMonthNo == item.Key))
{
action(m, item.Value);
}
}
答案 1 :(得分:2)
Select方法接受类型为Func<TSource, TResult>
的参数,因此您可以在方法中使用该类型,然后将其作为lambda表达式传递。
答案 2 :(得分:1)
您可以传递这样的操作来更新方法:
UpdateResultsListClaims(managementInfo,
(m) => m == someItem.Key,
(m, newData) => m.VolumeOfClaimsCancelled = someItem.Value)
private static void UpdateResultsListClaims(List<ManagementInfo> managementInfo,
Func<bool> updateCondition, Action<ManagementInfo> updateAction)
{
managementInfo
.Where(m => updateCondition(m))
.ToList()
.ForEach(m => updateAction(m));
}
更新1 为了更加可读,您可以致电:
UpdateResultsListClaims(managementInfo,
updateCondition: (m) => m == someItem.Key,
updateAction: (m, newData) => m.VolumeOfClaimsCancelled = someItem.Value)
更新2 为了便于在许多地方使用,您可以像这样制作扩展方法
public static void UpdateResults(this List<ManagementInfo> managementInfo,
Func<bool> updateCondition, Action<ManagementInfo> updateAction)
{
managementInfo
.Where(m => updateCondition(m))
.ToList()
.ForEach(m => updateAction(m));
}
并像这样称呼它
managementInfo.UpdateResults(
updateCondition: (m) => m == someItem.Key,
updateAction: (m, newData) => m.VolumeOfClaimsCancelled = someItem.Value)
答案 3 :(得分:0)
private static void UpdateCommonResultsList<T>(List<ManagementInfo> managementInfo, KeyValuePair<int, int> item, Func<ManagementInfo,T> updateFunc)
{
managementInfo
.Where(m => m.YearMonthNo == item.Key)
.Select(m => updateFunc(m))
.ToList();
}
然后调用:
UpdateCommonResultsList(managementInfo, item, (m => m.VolumeOfClaimsCancelled = item.Value));