2017-12-15 9 views
0

私はSpracheライブラリを使用しています。これにより、パーサーはLINQを使用して構築できます。しかし、時々私は何かを解析して結果を破棄する必要があります。たとえば:LINQの "from"ステートメントの行を破棄します。

from key in Identifier 
from __ws1 in OptionalWhitespace 
from __setter in PropertySetter 
from __ws2 in OptionalWhitespace 
from value in PropertyValue 
select ... 

私は__で始まる三つの変数のいずれかを必要としないので、彼らと名前空間を汚染し、不必要なようです。

LINQクエリを実行して3つの結果を破棄する方法はありますか?

+0

私はあなたがどこかにテーブルを一緒にリンクするためにどこかに参加していると思いますか?あなたの例を少し拡大して、他のテーブルの使い方を見ることができますか? –

+0

@Alex KeySmithこれはデータベースクエリではなく、Spracheライブラリを使用して構築されたパーサールールです。 –

+0

申し訳ありませんが、私の用語「テーブル」の使用はおそらく意味をなさないでしょう。私はあなたの他の_collections_がどのように使用されているか分かりませんでした。私はProperyValueを取得しようとしていますが、これはIdentifierにネストされていますか?問題のドメインを理解するのに役立ちますので、少し例を広げてください。 –

答えて

2

Spracheの深い知識がなくても、問題のドメインを理解するために例を単純化しました。

この例では、の値の1つにのみ興味があるLinqPadを使用して、から複数のステートメントを取得します。ですから、この任意の例では、人々とケーキのすべての組み合わせを知りたいのですが、ケーキの名前だけに興味があります。

var people = new List<string> { 
    "Billy", "Jimmy" 
}; 

var cake = new List<string> { 
    "Carrot Cake", "Chocolate Cake" 
}; 

(from p in people 
from c in cake 
select new 
{ 
    c 
}).Dump(); 

文からの複数のクロスになってしまうなど、ネストされたforeach文と考えることができます(ここではLINQ Join with Multiple From Clauses説明したように)参加

だから場合のは、これはSpracheの作者の意図であると仮定しましょう

people.SelectMany(p => cake, (p, c) => new { c }).Dump(); 
:それは私たちのようなもので終わる SelectMany().

されて終わる:(https://codeblog.jonskeet.uk/2011/01/28/reimplementing-linq-to-objects-part-41-how-query-expressions-work/ここで説明したように)流暢な構文でこれを書き換えるしよう

あなたはまだ「人」のパラメタで終わります。

私は、Spracheの意図を維持するために、__ステートメントを持たない方法はないことをお勧めします。おそらく自分自身で表現木を構築しない限り、それは生産的であるとは想像できません。

var parser = 
    from key in Identifier 
    from _ in OptionalWhitespace 
     .Then(_ => PropertySetter) 
     .Then(_ => OptionalWhitespace) 
    from value in PropertyValue 
    select new 
    { 
     key, 
     value 
    }; 

しかし関係ない部分はすぐにお互いに従わない場合、それは一般的な場合に役立つことはありません。あなたが一度にすべての関係ない部分を破棄するThenを使用することができ、この特定のケースで

+1

問題を完全に理解しています。これらの値を破棄する方法はありません。私はそれがやりたいことは一般的ではないと思います。回答ありがとうございます –

関連する問題