以下のLINQでSingle
を使用していませんが、「シーケンスに要素が含まれていません」という例外が発生します。
allNames = StockCollection.Where((s) => s.Name.IndexOf("A") == 0)
.Select((s) => s.Name)
.Aggregate((namesInfo, name) => namesInfo += ", " + name);
この例外は、名前が'A'
で始まる在庫がない場合に発生します。
1つの拡張メソッドは、条件を満たす少なくとも1つの要素を期待しているようですが、それは予期されていません。
これを解決するための最良の解決策を提案できますか?
前もって感謝します。
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()
が必要です。
空の種子と一緒に使用します。
new string[]{}.Aggregate("", (a,b)=> a+b )
空のソースでAggregate(func)を使用すると、InvalidOperationExceptionがスローされます。
ドキュメントを参照してください: http://msdn.Microsoft.com/en-us/library/bb548651.aspx