web-dev-qa-db-ja.com

シーケンスには、Singleを使用しなくてもlinqの要素例外は含まれていません

以下のLINQでSingleを使用していませんが、「シーケンスに要素が含まれていません」という例外が発生します。

allNames = StockCollection.Where((s) => s.Name.IndexOf("A") == 0)
                          .Select((s) => s.Name)
                          .Aggregate((namesInfo, name) => namesInfo += ", " + name);

この例外は、名前が'A'で始まる在庫がない場合に発生します。

1つの拡張メソッドは、条件を満たす少なくとも1つの要素を期待しているようですが、それは予期されていません。

これを解決するための最良の解決策を提案できますか?

前もって感謝します。

39
D J

Dennis Traubが指摘したように、使用しているAggregateのオーバーロードは、ソースシーケンスが空のときにその例外をスローします。

明白な修正は 初期シードを受け入れるAggregateのその他のオーバーロード を使用することですが、_string.Empty_が必要です)が、結果の先頭にコンマが表示されます。あなたは取り除く必要があります。

[〜#〜] edit [〜#〜]:これを回避するには、.DefaultIfEmpty(string.Empty)の後に既存のAggregate overload。これは、先行コンマを生成しません。)

いずれの場合でも、文字列を結合するためにAggregateをこのように使用することは良い考えではありません( Schlemiel the Painterのアルゴリズム が生成されます)。これが私がクエリを書く方法です:

_allNames = string.Join(",", StockCollection.Select(s => s.Name)
                                           .Where(name => name.StartsWith("A"));
_

.NET 3.5では、Whereの結果を配列に具体化するために.ToArray()が必要です。

71
Ani

空の種子と一緒に使用します。

new string[]{}.Aggregate("", (a,b)=> a+b )
11
Ferhat

空のソースでAggregate(func)を使用すると、InvalidOperationExceptionがスローされます。

ドキュメントを参照してください: http://msdn.Microsoft.com/en-us/library/bb548651.aspx

7
Dennis Traub