将Lambda选择器作为参数传递

时间:2012-11-12 17:12:27

标签: c# lambda

我正在处理一些报告代码,我发现自己重复了一段代码,其中包含一个地方和一次又一次选择的原因?唯一改变的信息是目标领域。

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

我可以重新编写所有代码,这样就没有必要了,但现在我已经想到了我是否愿意看看它是否可行。任何帮助表示赞赏。

4 个答案:

答案 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));