3

私はこのコードを持っています:

public string Label { get; set; }

public bool IsSpoon(out Spoon sp) 
{
    sp = null;
    foreach (Tool t in Tools.GetAllItems())
        if ((sp = t.AllSpoons.FirstOrDefault(x => x.Label == this.Label)) != null)
            break;

    return sp != null;
}

LINQを介してこれをどのように最適化できますか?

私はこのようなことを考えましたが、これは許可されていません:

public string Label { get; set; }

public bool IsSpoon(out Spoon sp) 
{
    return Tools.GetAllItems().FirstOrDefault(x => (sp = x.AllSpoons.FirstOrDefault(y => y.Label == this.Label)) != null) != null;
}
4

3 に答える 3

2

編集:私はパラメータに気づきませんでしたsp、ここに更新があります:

sp = Tools
    .GetAllItems()
    .SelectMany(x => x.AllSpoons)
    .FirstOrDefault(y => y.Label == this.Label);
return sp != null;
于 2012-09-06T13:06:21.050 に答える
2

SelectManyを使用してリストをフラット化できます。そうすれば、LINQステートメントの途中で値を割り当てるなどのトリッキーなことをする必要はありません。

public bool IsSpoon(out Spoon sp) 
{
    sp = Tools.GetAllItems().SelectMany(t => t.AllSpoons)
                            .FirstOrDefault(x => x.Label == this.Label);
    return sp != null;
}

本質的に同等のクエリ構文は次のとおりです。

sp = (from tool in Tools.GetAllItems()
      from spoon in tool.AllSpoons
      where spoon.Label == this.Label
      select spoon).FirstOrDefault();
于 2012-09-06T13:17:49.007 に答える
0
public bool IsSpoon(out Spoon sp) 
{ 
    return Tools.GetAllItems()
        .SelectMany(t => t.AllSpoons)
        .Any(x => x.Label == this.Label);
}
于 2012-09-06T13:05:17.497 に答える