3

XML ファイルに対して単純な Linq クエリを実行しています

IEnumerable<string> value = from item in myFile.Descendants("ProductName")
                            select (string)item;

通常 (複数の行がある場合) foreach ループを使用して反復できます。

foreach (string str in value)
{
    Console.WriteLine(str);
}

しかし、アイテムが 1 つだけで、メソッドのシグネチャが :

public string getValue()
{
    return ?;
}

何を返す必要がありますか ( foreachループを削除したい場合) ?

4

4 に答える 4

5

常に 1 つの文字列が存在することが確実な場合は、 を返すことができますvalue.Single()

その他のオプション:

複数の要素がある場合 (Singleまたはを使用SingleOrDefault)、または要素がまったくない場合(Firstまたはを使用) に例外を発生させたいかどうかによって異なりますSingle

常に 1 つの要素を除外する場合は、 Single()に固執します。これは、要素が 0 個または複数個ある場合に例外がスローされるためです。

于 2012-07-09T14:01:12.497 に答える
3

列挙可能な要素を 1 つに解決できるSingle/SingleOrDefaultおよびFirst/メソッドがあります。FirstOrDefault

このSingleメソッドは 1 つの要素のみを想定しており、結果に 0 個または複数の要素が含まれる場合は例外になります。SingleOrDefaultゼロだけでなく 1 にも対処するために使用します。

「最初の」ペアは両方とも複数を処理できますFirstが、要素がない場合は再びスローされます。

これらのメソッドにはすべて、条件を指定できるオーバーロードが付属しており、.Where呼び出しを使用する必要がありません。

あなたの場合:

string value = (from item in myFile.Descendants("ProductName")
                select (string)item)
               .SingleOrDefault();

Single または First のどちらかを選択するときは、Single1 つの要素が予想される場合は使用SingleOrDefaultし、ゼロまたは 1 つの要素が予想される場合は使用し、返される要素の数を気にしない場合は(ある種の と共に) First/を使用します。FirstOrDefaultOrderBy

また、これらのメソッドは遅延実行を使用するため、First満たされると反復が停止することにも注意してください。

于 2012-07-09T14:02:38.990 に答える
2

アイテムを 1 つだけ返したい場合は、次を使用しますFirstOrDefault()

public string getValue()
{
    IEnumerable<string> value = from item in myFile.Descendants("ProductName")
                        select (string)item;
    return value.FirstOrDefault();
}
于 2012-07-09T14:01:00.717 に答える
0

1 つしか持っておらず、1 つだけでなければならないことが確実な場合は、 を使用する必要がありますSingle。複数ある場合、これは実際に例外をスローします。

于 2012-07-09T14:06:11.557 に答える