2

私はいくつかのレポート コードに取り組んでいますが、where と select の原因を含む特定のコードを何度も繰り返していることに気付きました。変更される唯一の情報は、ターゲット フィールドです。

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

1 つのメソッドを再利用できるように、セレクターを引数として渡すことはできますか?

の線に沿って

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>ので、その型をメソッドで使用し、ラムダ式として渡すことができます。

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

UPDATE 1 読みやすくするために、次のように呼び出すことができます。

UpdateResultsListClaims(managementInfo,
  updateCondition: (m) => m == someItem.Key,
  updateAction: (m, newData) => m.VolumeOfClaimsCancelled = someItem.Value)

UPDATE 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 に答える