3

IQueryable オブジェクトの現在お​​よび前の要素にアクセスする必要があります。int 配列がある場合は、次のようにします。

var array = new int[]{0,1,2,3,4};
for(var i = 1; i<array.Length ; i++)
{
    method1(array[i-1], array[i]);
}

IList を実装していないため、IQueryable で同じことを行う方法がわかりません。

4

5 に答える 5

3

拡張メソッドを使用すると、これはかなり簡単になります。

public static class IEnumerableExtensions
{
  public static IEnumerable<ValueWithPrevious<T>> WithPrevious<T>(this IEnumerable<T> @this)
  {
    using (var e = @this.GetEnumerator())
    {
      if (!e.MoveNext())
        yield break;

      var previous = e.Current;

      while (e.MoveNext())
      {
        yield return new ValueWithPrevious<T>(e.Current, previous);
        previous = e.Current;
      }
    }
  }
}

public struct ValueWithPrevious<T>
{
  public readonly T Value, Previous;

  public ValueWithPrevious(T value, T previous)
  {
    Value = value;
    Previous = previous;
  }
}

使用法:

var array = new int[] { 1, 2, 3, 4, 5 };
foreach (var value in array.WithPrevious())
{
  Console.WriteLine("{0}, {1}", value.Previous, value.Value);
  // Results: 1, 2
  //          2, 3
  //          3, 4
  //          4, 5
}
于 2009-04-02T15:00:07.917 に答える
3

編集

質問を少し読み違えてください。このコードは、結果的な要素を提供します

public static IEnumerable<Pair<T,T>> GroupIntoConsequetive(this IEnumerable<T> enumerable) {
  using ( var e = enumerable.GetEnumerator() ) {
    if ( !e.MoveNext() ) { 
      yield break;
    }
    var last = e.Current;
    while ( e.MoveNext() ) {
      yield return new Pair<T,T>(last, e.Current);
      last = e.Current;
    }
  }
}

デフォルトの方法があるかどうかはわかりませんが、そのための拡張メソッドを作成することは難しくありません。単純な Pair 実装があると仮定しています

public static IEnumerable<Pair<T,T>> Window(this IEnumerable<T> enumerable) {
  using ( var e = enumerable.GetEnumerator() ) {
    while ( e.MoveNext() ) { 
      var first = e.Current;
      if ( !e.MoveNext() ) {
        throw new InvalidOperationException("Need even number");
      }
      var second = e.Current;
      yield return new Pair<T,T>(first,second);
   }
  }
}

ウィンドウを使用すると、次のようにして、必要な動作を得ることができます

var col = GetQueryableItem();
col.Window().Select(pair => method1(pair.First, pair.Second));

クイック アンド ダーティ ペアの実装

public struct Pair<T1,T2> {
  public readonly T1 First;
  public readonly T2 Second;
  public Pair(T1 first, T2 second) {
    First = first;
    Second = second;
  }
}
于 2009-04-02T14:20:24.657 に答える
3

ToList<>() を使用して、IQueryable<> を List<> に変換できます。

于 2009-04-02T14:23:04.807 に答える
1

IQueryable<T>ただし、インスタンスから配列またはリストを作成するための拡張メソッドを提供します。 ToArray()およびToList( ) を参照してください。次に、例の配列と同じように実行できます。

于 2009-04-02T14:26:13.410 に答える
0

IQueryable は IEnumerable です。したがって、次のようなことができます。

var a = new [] {1, 2, 3, 4}.AsQueryable();

if (a.Count() < 2) {
    return;
}

var prev = a.First();
var isFirst = true;

foreach (var i in a) {
    if (isFirst) {
        isFirst = false;
        continue;
    }

    method1(prev, i);
    prev = i;
}

または、単純に IQueryable を IList に変換します。

var list = a.ToList();
于 2009-04-02T14:38:19.963 に答える