3

jQuery's end()LINQ の機能に似たものはありますか?

では、以前の選択から結果セットを変更できますか?

4

1 に答える 1

4

.NET には同様のものはありません。IEnumerable<>anが 2 回列挙可能である (または 2 つの結果が同じになる)という保証さえありません。多くの場合、各列挙はクエリ (またはそれが何であれ) をやり直します。たとえば、次のようにします。

** 本当に機能するコードですが、ひどいものです! (下記参照) **

var persons = from p in ctx.Persons select p;

foreach (var person in persons) { }

foreach (var person in persons) { }

wherectx.Personsは SQL Server のテーブルで、それぞれforeachがクエリをやり直します。

.NET で同様のもの (キャッシング スタック列挙子) を構築することは可能だと思いますが、すべての LINQ メソッドを書き直す必要があります (これは LINQ-to-Objects の場合のみです)。

より意味論的な別の問題があります。LINQ はクエリ用の言語であり、メソッドはありませんForEach。jQuery のメソッドは異なります。それらは、クエリによって返されたアイテムに対して「作用」します。したがって、.NET でこのようなことを行う唯一の「正しい」場所は、同じクエリに対して複数の結果セットを持つことができることです...次のようなもの:

** 例として、コードが機能しない **

var res = (from p in myItems select p).StackfulEnumerable()
                                      .Count(p => p.SomeProperty == 1)
                                      .Pop() // like the End() of jquery
                                      .Count(p => p.SomeProperty == 2);

res一部は現在 aです (何らかの方法でTuple<int, int>... 技術的には、タイプ セーフな方法で a を返すようにするのは非常に複雑Tuple<int, int>です。C# では可変数の引数を持つタイプ セーフなジェネリック メソッドを構築できないためです)

さて、明らかに誰かがこれを行うことができます:

** 実際に機能するコード **

var enu = // my enumerable

var res = from p in new[] { enu }
          let res1 = p.Where(q => q.Prop == 1)
          let res2 = p.Where(q => q.Prop == 2)
          select Tuple.Create(res1.ToArray(), res2.ToArray());

大丈夫ですが、2回列挙していることを忘れないでくださいenu!

明らかに、安全にプレイできます。

** 実際に機能するコード **

var res = from p in new[] { enu.ToList() }
          let res1 = p.Where(q => q.Prop == 1)
          let res2 = p.Where(q => q.Prop == 2)
          select Tuple.Create(res1.ToArray(), res2.ToArray());

少なくとも、何回でも安全に列挙できるものを 2 回列挙することになることがわかりました。

次のように記述できることに注意してください。

** 実際に機能するコード **

          select Tuple.Create(res1, res2);

ただし、 の 2 つの列挙型を列挙するたびにTuple、「ソース」を再度列挙します ( ToList()2 番目の例のように を使用しない場合)。

于 2013-09-02T11:47:58.517 に答える