2017-03-11 7 views
0

は、これは私のXMLファイルです:てToArray()せずに、単一の項目にLINQのマッチングを行うためにどのように

<items> 
    <item>Apples</item> 
    <item>Lemon</item> 
    <item>Grapefruit</item> 
</items> 

そして私は最後の項目に一致する、このXMLリスト内<item>のいずれかどうかを確認しようとしています以下の私のリストに:現時点で

var titleList = new List<string> { "Pear", "Lime", "Lemon" }; 

私はこのようにそれを行う:

var itemMatch = Settings.xdoc.Root 
    .Descendants("Items") 
    .Where(test => titleList.Last().Contains((string)test.Element("Item"))) 
    .ToArray(); 

foreach (var item in itemMatch) 
{ 
    Debug.WriteLine(item.Element("item")); 
} 

しかしforeachループは思わ1つの試合(この場合はレモン)だけが存在するため、無意味です。どのようにループなしでこれを行うことができますが、まだどの項目が一致しているか知っていますか?ノーならば

var itemMatch = Settings.xdoc.Root 
    .Descendants("Items") 
    .FirstOrDefault(test => titleList.Last().Contains((string)test.Element("Item"))); 

これはあなたの述語またはデフォルト値(null)に一致する最初の要素を与える:

+1

私は質問で混乱しています。なぜあなたはToArrayを最初に呼びますか?あなたが 'ToArray'への不必要な呼び出しを望まないなら、なぜ単にそれを削除していないのですか?また、質問のタイトルやあなたが求めている質問がまったく違うようです。ここで実際に何を求めているのですか? –

答えて

4

単純な方法でWhereに「マージ」することができますFirstOrDefault(またはFirst)を使用します要素が一致します。 Firstを使用すると、一致する要素がない場合に例外がスローされます。

SingleOrDefaultSingleもあります。一致するものが1つだけあることを確認します。したがって、2つ以上の一致がある場合、例外がスローされます。


あなたのコードは動作しませんが、ここで、それはあなたが提供したXMLに基づいて動作させるための方法です

:あなたの質問のこの部分の近くに読め

var titleList = new List<string> { "Pear", "Lime", "Lemon" }; 
var lastItemInList = titleList.Last(); 
var itemMatch = Settings.xdoc.Root 
    .Elements("item") 
    .FirstOrDefault(item => (string) item == lastItemInList) 

このXMLリストのどれかがリストの最後のアイテムと一致するかどうかを調べようとしています

<item>Lemon</item>がXMLに存在するかどうかを判断したいという印象を受けます。その場合、FirstOrDefaultAnyに置き換えることができます。戻り値は、要素が見つかったかどうかを示すboolになります。


また、およそToArrayあなたの質問のタイトルである:あなたはforeachを使用して結果を列挙する前にToArrayを呼び出す必要はありません。 ToArrayを呼び出すと、シーケンスが列挙され、配列に格納され、foreachに列挙された配列になります。ただし、元のシーケンスを一度列挙するには、配列に格納する必要がないので、ToArrayへの呼び出しをスキップできます。

+0

ありがとうございました。ちょうど私が必要なもの。 – James

+0

ハングアップします。私はそれが機能していると思ったが、XMLファイルの最初の項目と、titleListの最後の項目を比較しているように見えるだけで、XMLファイルのすべての項目とは異なると思われる。 titleList.Last()から "Lemon"を探しているはずです James

+0

@JamesNapier:シーケンスに1つの結果しかないことが分かっていたときに 'foreach'ループを回避する方法について質問しました。しかし、提供されたXMLを使用してコードを実行しようとすると、コードに予期されるXML構造と質問で提供されるXML構造との間に不一致があるように思われることはありません。私はその問題を解決する方法を解説して答えを更新しようとします。 –