2

我正在处理一些报告代码,我发现自己重复了一段代码,其中包含一个 where 和 select cause 一遍又一遍?唯一改变的信息是目标字段。

    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

4 回答 4

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);
    }
}
于 2012-11-12T17:17:33.080 回答
2

Select 方法采用类型参数,Func<TSource, TResult>因此您可以在方法中使用该类型,然后将其作为 lambda 表达式传入。

于 2012-11-12T17:17:03.617 回答
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)
于 2012-11-12T17:23:16.400 回答
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));
于 2012-11-12T17:20:23.440 回答