[解決済み】Sequence contains no matching element(シーケンスにマッチする要素がない
2022-02-02 09:06:55
質問
私は、データ操作のためにlinqを使用しているasp.netアプリケーションを持っています。実行中に、例外 "Sequence contains no matching element" が発生しました。
if (_lstAcl.Documents.Count > 0)
{
for (i = 0; i <= _lstAcl.Documents.Count - 1; i++)
{
string id = _lstAcl.Documents[i].ID.ToString();
var documentRow = _dsACL.Documents.First(o => o.ID == id);
if (documentRow !=null)
{
_lstAcl.Documents[i].Read = documentRow.Read;
_lstAcl.Documents[i].ReadRule = documentRow.ReadRule;
_lstAcl.Documents[i].Create= documentRow.Create;
_lstAcl.Documents[i].CreateRule = documentRow.CreateRule;
_lstAcl.Documents[i].Update = documentRow.Update;
_lstAcl.Documents[i].UpdateRule = documentRow.UpdateRule;
_lstAcl.Documents[i].Delete = documentRow.Delete;
_lstAcl.Documents[i].DeleteRule = documentRow.DeleteRule;
}
}
}
解決方法は?
この行で例外が発生しているのでしょう。
var documentRow = _dsACL.Documents.First(o => o.ID == id)
First()
は、マッチする要素が見つからない場合は例外をスローします。その直後に null をテストしていることからすると、どうやら
FirstOrDefault()
これは、一致する項目が見つからない場合、要素タイプのデフォルト値 (参照タイプでは null) を返します。
var documentRow = _dsACL.Documents.FirstOrDefault(o => o.ID == id)
その他、状況に応じて考慮すべきオプションは
Single()
(一致する要素がちょうどひとつだけだと思う場合) と
SingleOrDefault()
(一致する要素が1つまたは0つだと思うとき)。私が思うに
FirstOrDefault
このケースでは、他の選択肢も知っておくとよいでしょう。
一方、そもそもここにjoinを入れた方が良いようにも見えます。もし、それが すべて を使用することができます。
var query = from target in _lstAcl.Documents
join source in _dsAcl.Document
where source.ID.ToString() equals target.ID
select new { source, target };
foreach (var pair in query)
{
target.Read = source.Read;
target.ReadRule = source.ReadRule;
// etc
}
もっとシンプルに と より効率的だと思います。
たとえ、あなたが する ループを維持することに決めたら、いくつかの提案があります。
-
外側の
if
. Count が 0 の場合、for ループのボディは決して実行されないので、これは必要ありません。 -
forループでは排他的上限値を使用する - C#ではより慣用的である。
for (i = 0; i < _lstAcl.Documents.Count; i++)
-
共通する部分式を削除する。
var target = _lstAcl.Documents[i]; // Now use target for the rest of the loop body
-
可能な場合は
foreach
の代わりにfor
を開始します。foreach (var target in _lstAcl.Documents)
関連
-
[解決済み】スクリプトクラスが見つからないので、スクリプトコンポーネントを追加できない?
-
[解決済み] 保護レベルによりアクセス不能になりました。
-
[解決済み】「入力文字列が正しい形式ではありませんでした」エラーの解決方法は?[重複しています]。
-
[解決済み】クロススレッド操作が有効でない。作成されたスレッド以外のスレッドからアクセスされたコントロール
-
[解決済み】Entity FrameworkからのSqlException - セッション内で他のスレッドが動作しているため、新しいトランザクションは許可されません。
-
VSでscanfエラーを恒久的に解決するには、ソースファイルを作成し、自動的に#define _CRT_SECURE_NO_WARNINGS 1を追加してください。
-
[解決済み] C#でこの辞書のキーが存在するかどうかを検出するにはどうすればよいですか?
-
[解決済み】大文字・小文字を区別しない「Contains(string)
-
[解決済み】Entity Frameworkプロバイダタイプをロードできませんでしたか?
-
[解決済み] リストに文字列を含む要素があるかどうかを確認し、その要素を取得する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】プログラム実行中に1秒待つ
-
解決済み] Critical error detected c0000374 - C++ dll returns pointer off allocated memory to C# [解決済み] Critical error detected c0000374 - C++ dll returns pointer off allocated memory to C#.
-
[解決済み】ソケットのアドレス(プロトコル/ネットワークアドレス/ポート)は、通常1つしか使用できない?
-
[解決済み】Unity3DでOnTriggerEnterが動作しない件
-
[解決済み】非静的メソッドはターゲットを必要とする
-
[解決済み】なぜこのコードはInvalidOperationExceptionを投げるのですか?
-
[解決済み】Unity 「関連するスクリプトを読み込むことができません」「Win32Exception: システムは指定されたファイルを見つけることができません"
-
[解決済み】ファイルへの読み書きの際に共有違反のIOExceptionが発生する C#
-
[解決済み】WSACancelBlockingCallの例外について
-
[解決済み】名前 'ViewBag' が現在のコンテキストに存在しない - Visual Studio 2015