2014-07-17 2 views
5

sagt, ich habe diese Liste: 1, 3, 5, 7, 9, 13Erhalten vorherigen/nächsten Element eines bestimmten Elements in einer Liste <>

Zum Beispiel gegebenen Wert: 9 ist, die vorherigen Artikel ist 7 und der nächste Artikel ist 13

Wie kann ich dies mit C# erreichen?

+2

Ermittelt den Index des gegebenen Punkt hilfreich sein kann. Füge 1 hinzu, um als nächstes zu bewegen, subtrahiere eins, um vor dich zu ziehen. Achten Sie darauf, Grenzen zu prüfen. – DGibbs

+0

Index von +/- 1 .... was hast du probiert? – Sayse

+0

Welche Art von Liste? Es ist sehr einfach mit einer (doppelt) verknüpften Liste, wie die 'LinkedList ' Klasse. –

Antwort

16

Sie können Indexer verwenden, um Element bei gewünschten Index zu erhalten. Hinzufügen von eins zum Index erhalten Sie nächste und Subtrahieren von eins aus Index gibt Ihnen vorherige Element.

int index = 4; 
int prev = list[index-1]; 
int next = list[index+1]; 

Sie müssen prüfen, ob neben und vorherigen Index andere weise existiert, wird Sie IndexOutOfRangeException Exception. Als Liste ist Zero-basierten Index so ersten Element wird Index 0 haben und zweiten wird 1 und so weiter haben.

if(index - 1 > -1) 
    prev = list[index-1]; 
if(index + 1 < list.Length) 
    next = list[index+1]; 
2
int index = list.IndexOf(9); // find the index of the given number 

// find the index of next and the previous number 
// by taking into account that 
// the given number might be the first or the last number in the list 
int prev = index > 0 ? index - 1 : -1; 

int next = index < list.Count - 1 ? index + 1 : -1; 

int nextItem, prevItem; 

// if indexes are valid then get the items using indexer 
// otherwise set them to a temporary value, 
// you can also use Nullable<int> instead 
nextItem = prev != -1 ? list[prev] : 0; 
prevItem = next != -1 ? list[next] : 0; 
+0

Es könnte verwirrend sein. Was ist, wenn das Element der Liste "0" ist? Dann konnten wir nicht bestimmen, ob es ein nächstes/letztes Element auf der Liste gibt oder einfach nur ein Element in der Liste. –

+0

@pwas ja ich denke, mit Nullable wäre eine bessere Idee –

1
var index = list.IndexOf(9); 
if (index == -1) 
{ 
    return; // or exception - whater, no element found. 
} 

int? nextItem = null; //null means that there is no next element. 
if (index < list.Count - 1) 
{ 
    nextItem = list[index + 1]; 
} 

int? prevItem = null; 
if (index > 0) 
{ 
    prevItem = list[index - 1]; 
} 
3
 List<int> listInts = new List<int>(); 
     listInts.AddRange(new int[] { 1, 3, 5, 7, 9, 13 }); 
     int index = listInts.IndexOf(3); //The index here would be "1" 
     index++; //Check first if the index is in the length 
     int element = listInts[index]; //element = 5 
1

Ich habe dies durch Vererben die

.Net Liste implementiert
public class NavigationList<T> : List<T> 
    { 
     private int _currentIndex = 0; 
     public int CurrnetIndex 
     { 
      get 
      { 
       if (_currentIndex > Count - 1) { _currentIndex = Count - 1; } 
       if (_currentIndex < 0) { _currentIndex = 0; } 
       return _currentIndex; 
      } 
      set { _currentIndex = value; } 
     } 

     public T MoveNext 
     { 
      get { _currentIndex++; return this[CurrnetIndex]; } 
     } 

     public T MovePrevious 
     { 
      get { _currentIndex--; return this[CurrnetIndex]; } 
     } 

     public T Current 
     { 
      get { return this[CurrnetIndex]; } 
     } 
    } 

Mit diesem wird ganz einfach

NavigationList<string> n = new NavigationList<string>(); 
      n.Add("A"); 
      n.Add("B"); 
      n.Add("C"); 
      n.Add("D"); 
      Assert.AreEqual(n.Current, "A"); 
      Assert.AreEqual(n.MoveNext, "B"); 
      Assert.AreEqual(n.MovePrevious, "A"); 
0

zu machen eine Art Rund Liste, versuchen Sie dies:

public class NavigationList<T> : List<T> 
{ 
    private int _currentIndex = -1; 
    public int CurrnetIndex 
    { 
     get 
     { 
      if (_currentIndex == Count) 
       _currentIndex = 0; 
      else if (_currentIndex > Count - 1) 
       _currentIndex = Count - 1; 
      else if (_currentIndex < 0) 
       _currentIndex = 0; 


      return _currentIndex; 
     } 

     set { _currentIndex = value; } 
    } 

    public T MoveNext 
    { 
     get { _currentIndex++; return this[CurrnetIndex]; } 
    } 

    public T Current 
    { 
     get { return this[CurrnetIndex]; } 
    } 
} 
0

Nach

int NextValue = 0; 
int PreviousValue =0; 
int index = lstOfNo.FindIndex(nd =>nd.Id == 9); 

var Next = lstOfNo.ElementAtOrDefault(index + 1); 
var Previous = lstOfNo.ElementAtOrDefault(index - 1); 

if (Next != null) 
    NextValue = Next; 


if (Previous != null) 
    PreviousValue = Previous; 
Verwandte Themen