2013-03-11 27 views
5

İki öğeyi geçecek ve iki sayfayı karşılaştıracak bir sıralama listesi var. C# 'daki SortedList sınıfında bir sonraki ve bir sonraki yapacak bir işlev var mı? .Skip ile biraz yardım aldım, ama anahtarlar değişken olacağından, bu nasıl çalışır? Tek yapmam gereken ilk elementi ve ikinci elementi almak, sonra üçüncü ve dördüncü, beşinci ve altıncı, vb. Atlamak. Bunun gibi, LinkedList'in ".next.next." Kadar basit olmasını isterdim.Sıralı Liste C'deki sonraki ve önceki öğelerin değerlerini al C#

double velocity = positionList.Values.Skip(1); 

Düzenleme: positionList

<double, HandCoordinate> 
    HandCoordinate = {double, double, double} 

bu yardım mı yazmaktır?

Teşekkürler!

+1

Bu bir liste olduğundan, neden bir dizin ve artış kullanmıyorsunuz? azaltmak mı? –

+0

Tam olarak "positionList" türünü belirtin. Şimdi bir sözlük gibi görünüyor. –

+0

@Henk Holterman: 'SortedList'' Values' özelliği vardır. –

cevap

0
List<int> ints = new List<int>(); 
    ints.Add(1); 
    ints.Add(2); 
    ints.Add(3); 
    ints.Add(4); 
    for (int i = 0; i < ints.Count; i += 2) 
    { 
    var pair = ints.Skip(i).Take(2); 
    var first = pair.First(); 
    var last = pair.Last(); 
    } 

Not: Bu, teoride türden alakasız olarak çalışmalıdır. Tip, farklı bir format değilse.

Skip() olmadan.

var pair = new { First = ints[i], Second = ints[i += 1] }; 
+0

Skip() is O (n) olduğundan O (n^2) olacaktır. Büyük listeler için uygun değildir. –

+0

@HenkHolterman, op, örnekte atla kullanır, aynı şeyi yapmak mantıklı mıdır? – LukeHennerley

+0

@HenkHolterman iki şekilde de, Skip() 'kullanmadan bir yol belirttim. – LukeHennerley

0

Sorun biraz açık değil. Listeden bir çift şey almanız gerektiğini mi tahmin ediyorum? Bunu kullanmak, böylece

using System; 
using System.Collections.Generic; 

namespace Demo 
{ 
    internal static class Program 
    { 
     public static void Main() 
     { 
      double[] test = new double[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; 

      foreach (var pair in test.AsPairs()) // This is how you use it. 
      { 
       Console.WriteLine("({0}, {1})", pair.Item1, pair.Item2); 
       // Or simply: Console.WriteLine(pair); 
      } 
     } 
    } 

    public static class EnumerableExt 
    { 
     public static IEnumerable<Tuple<T, T>> AsPairs<T>(this IEnumerable<T> sequence) 
     { 
      bool isFirst = true; 
      T first = default(T); 

      foreach (var item in sequence) 
      { 
       if (isFirst) 
       { 
        first = item; 
        isFirst = false; 
       } 
       else 
       { 
        isFirst = true; 
        yield return new Tuple<T, T>(first, item); 
       } 
      } 
     } 
    } 
} 
0

sınıf SortedList inherites IEnumerator:

Bu bir IEnumerable öğelerin çiftleri dizisini sunacak bir uzantısı yöntem yazmak oldukça kolay

SortedList list = ... 
var listEnumerator = ((IEnumerable)list).GetEnumerator(); 
Pair<MyType> pair = null 
do 
{ 
    pair = Pair.Next<MyType>(listEnumerator); 
    ... 
} 
while(pair != null) 

...

class Pair<T> 
{ 
    public T First {get; set;} 
    public T Second {get; set;} 

    public static Pair<T> Next<T>(IEnumerator enumerator) 
    { 
     var first = enumerator.Current; 
     if(enumerator.MoveNext()) 
     { 
      return new Pair<T> 
       { 
        First = (T)first, 
        Second = (T)enumerator.Current, 
       } 
     } 
     return null; 
    } 
} 
İlgili konular