8

以下は、いくつかのlinqpadテストコードです。これを実行すると、「item」の2番目のインスタンスに空のリストではなくサブアイテムのnullリストがあるため、エラーが発生します。

両方の状況(nullまたは空のリスト)をまったく同じように扱いたいのですが、リストにnullチェックを入れて、nullがあるときに空のリストを初期化するよりもクリーンな方法があるのではないかと思いました。

言い換えれば、私はこれを行うことができます:

from si in (i.subitems == null ? new List<item>() : i.subitems)

しかし、それは少し醜いので、どうすればそれを改善できるのだろうかと思いました。

public class item
{
    public string itemname { get; set; }
    public List<item> subitems { get; set; }
}

void Main()
{
    List<item> myItemList = new List<item>() 
    {
        new item 
        {
            itemname = "item1",
            subitems = new List<item>()
            {
                new item { itemname = "subitem1" },
                new item { itemname = "subitem2" }
            }
        },
        new item 
        {
            itemname = "item2"
        }
    };

    myItemList.Dump();

    var res = (from i in myItemList
            from si in i.subitems
            select new {i.itemname, subitemname = si.itemname}).ToList();

    res.Dump();
}

ボーナスの質問として、この同じlinqクエリをラムダとして表し、nullを同じように扱うことができますか?

乾杯、クリス

4

4 に答える 4

15

null合体演算子を使用できます

var res = (from i in myItemList
           from si in i.subitems ?? new List<item>()
           select new { i.itemname, subitemname = si.itemname }).ToList();

しかし、空のものを除外する必要があると思います

var res = (from i in myItemList
           where i.subitems != null
           from si in i.subitems
           select new { i.itemname, subitemname = si.itemname }).ToList();

ラムダバージョンについては、あなたが言うことができます

var res = myItemList.Where(x => x.subitems != null)
                    .SelectMany(
                        x => x.subitems.Select(
                            y => new { x.itemname, subitemname = y.itemname }
                        )
                     );

しかし、クエリ構文のバージョンの方がはるかに読みやすいです。

于 2010-02-04T17:52:42.047 に答える
12
from si in (i.subitems ?? new List<item>())

どのようにそのことについて?

于 2010-02-04T17:48:08.937 に答える
10

あなたはあなたのために仕事をするために(邪悪な)拡張メソッドを追加することができます

public static IEnumerable<T> EnsureNotEmpty<T>(this IEnumerable<T> enumerable) {
  if ( enumerable == null ) {
    return Enumerable.Empty<T>();
  } else { 
    return enumerable;
  }
}
于 2010-02-04T17:49:03.727 に答える
0

追加の方法は、サブアイテムを null にできないようにすることです。サブアイテムを空のリストにデフォルト設定し、サブアイテムセッターでnullを許可しないように、アイテムコンストラクターを作成できます。

もちろん、アイテムを変更するアクセス権があることを前提としています。

ヌル合体演算子は、Hunter Daley が指摘したように探しているものです

于 2010-02-04T17:54:01.183 に答える