0

リストに格納されている特定のクラスのプロパティを使用してコンマ区切りの値のリストを作成するための、この非常に便利な小さなコードを見つけました (Google の ToComma リンク - 記事は codeproject にあります)。

特定のセパレーターを処理するように変更しましたが、うまく機能しますが、特定のオブジェクトのプロパティの一部にnull値が含まれることがあり、このコードを拡張してnullを処理して置き換えることができるかどうか疑問に思っていますプロパティの型に基づくデフォルト値、つまり文字列の場合は null を string.empty に置き換え、数値の場合は 0 に置き換え、bool の場合は false に置き換えます。

コンマ区切りの値で構築しようとしている問題のプロパティに null 値が含まれている場合、エラーがスローされます。つまり、オブジェクト参照がインスタンスに設定されていません...

コードは次のとおりです。

public static string ToSeparator<T, TU>(this IEnumerable<T> source, 
Func<T, TU> func, string separator)
{
    return string.Join(separator, source.Select(s => func(s).ToString()).ToArray());
}

たとえば、Person オブジェクトが FirstName、Surname、Age で構成されるリスト、つまり List Persons があると仮定すると、次のように簡単に呼び出すことができます。

persons.ToSeparator(m => m.FirstName, "-"); 
persons.ToSeparator(m => m.Age, "-"); 

上記のコードを使用してこれを行うことはできますか? 上記のコードを使用して実行できない場合、リンクおよび/またはラムダ式を使用してこれを処理する最良の方法は何でしょうか.

ありがとう。

4

5 に答える 5

1

ここでカスタムのデフォルト値を求めています。意味のある唯一のことは、 a のようなものを持っていてそれらをボックス化しstring => ""ていない限り、 T が値型である型付きコレクションに null を含めることができないため、変換です。List<object>

default(string)実際にはどの参照型でも同じであるためnull、メソッドにデフォルト値を渡す必要があります。使用できます:

source.Select(x => {
                  var value = func(x);
                  return value == null ? defaultValue : value.ToString();
              });
于 2013-06-05T01:12:52.687 に答える
0

ToSeparator に渡される Func を実行しているため、その関数でどのようなエラーが発生するかを知る方法はありません。

メソッド内の func の実行を try/catch ブロックで囲み、例外をキャッチしたときに別のものを返すことができます。

于 2013-06-05T02:24:45.143 に答える
-1

これが最終的な解決策です(ありがとう@Ed S.、みんな!)

public static string ToSeparator<T, TU>(this IEnumerable<T> source, 
Func<T, TU> func, string separator)
    {
        return string.Join(separator, source.Select(x => {
              var value = func(x);
              return value == null ? string.Empty : value.ToString();
          }));
    }

public static string ToSeparator<T, TU, TZ>(this IEnumerable<T> source, 
Func<T, TU> func, TZ defaultValue, string separator)
    {
        return string.Join(separator, source.Select(x =>
        {
            var value = func(x);
            return value == null ? defaultValue.ToString() : value.ToString();
        }));
    }

これが他の誰かに役立つことを願っています!!

于 2013-06-05T03:06:40.590 に答える
-1

試す:

public static string ToSeparator<T, TU>(this IEnumerable<T> source, 
    Func<T, TU> func, string separator)
{
    return string.Join(separator, source.Select(s => (s == null ? default(TU) : func(s))
        .ToString()).ToArray());
}

セレクターが親タイプのプロパティよりも「深い」場合、つまり次のように注意してください。

persons.ToSeparator(m => m.Address.ZipCode, "-");

これは完全に崩壊します。最初に選択を行い、私が行ったのと同じようにnullを処理し(SelectNullOrDefaultまたは何かの別の拡張メソッドを作成する可能性があります)、次にTHATをソースとしてToSeparatorメソッドに渡します...はるかに安全です。

于 2013-06-05T00:57:26.580 に答える