获取List <>中给定项的上一个/下一个项

Nee*_*ers 18 c# list

说我有这个清单:1,3,5,7,9,13

例如,给定值为:9,前一项为7,下一项为13

我如何使用C#实现这一目标?

Adi*_*dil 27

您可以使用索引器获取所需索引的元素.将一个添加到索引将使您接下来并从索引中减去一个将为您提供前一个元素.

int index = 4; 
int prev = list[index-1];
int next = list[index+1];
Run Code Online (Sandbox Code Playgroud)

您将不得不检查下一个和上一个索引是否存在,否则您将获得IndexOutOfRangeException异常.由于List是基于零的索引,因此第一个元素将具有索引0,第二个元素将具有索引1,依此类推.

if(index - 1 > -1)
   prev = list[index-1];
if(index + 1 < list.Length)
   next = list[index+1];
Run Code Online (Sandbox Code Playgroud)


Bar*_*aro 19

在一行中使用 LINQ 并进行循环搜索:

下一个

YourList.SkipWhile(x => x != NextOfThisValue).Skip(1).DefaultIfEmpty( YourList[0] ).FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

上一个

YourList.TakeWhile(x => x != PrevOfThisValue).DefaultIfEmpty( YourList[YourList.Count-1]).LastOrDefault();
Run Code Online (Sandbox Code Playgroud)

这是一个工作示例(链接到小提琴)

    List<string> fruits = new List<string> {"apple", "banana", "orange", "raspberry", "kiwi"};
    string NextOf = "orange";
    string NextOfIs;

    NextOfIs = fruits.SkipWhile(x => x!=NextOf).Skip(1).DefaultIfEmpty(fruits[0]).FirstOrDefault();
    Console.WriteLine("The next of " + NextOf + " is " + NextOfIs);

    NextOf = "kiwi";
    NextOfIs = fruits.SkipWhile(x => x!=NextOf).Skip(1).DefaultIfEmpty(fruits[0]).FirstOrDefault();
    Console.WriteLine("The next of " + NextOf + " is " + NextOfIs);

    string PrevOf = "orange";
    string PrevOfIs;

    PrevOfIs = fruits.TakeWhile(x => x!=PrevOf).DefaultIfEmpty(fruits[fruits.Count-1]).LastOrDefault();
    Console.WriteLine("The prev of " + PrevOf + " is " + PrevOfIs);

    PrevOf = "apple";
    PrevOfIs = fruits.TakeWhile(x => x!=PrevOf).DefaultIfEmpty(fruits[fruits.Count-1]).LastOrDefault();
    Console.WriteLine("The prev of " + PrevOf + " is " + PrevOfIs);
Run Code Online (Sandbox Code Playgroud)


Yur*_*Kot 8

另外,如果您想要具有循环逻辑的紧凑解决方案而不创建新列表,您可以使用以下代码:

int nextNumber = list[(list.IndexOf(currentNumber) + 1) % list.Count];
int previousNumber = list[(list.IndexOf(currentNumber) - 1 + list.Count) % list.Count];
Run Code Online (Sandbox Code Playgroud)

https://dotnetfiddle.net/PkP2Jy


xec*_*ons 6

        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
Run Code Online (Sandbox Code Playgroud)


BJ *_*tel 6

以下可能会有所帮助

 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;
Run Code Online (Sandbox Code Playgroud)


Thu*_*der 5

我已经通过继承.Net列表实现了这一点

public class NavigationList<T> : List<T>
    {
        private int _currentIndex = 0;
        public int CurrentIndex
        {
            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[CurrentIndex]; }
        }

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

        public T Current
        {
            get { return this[CurrentIndex]; }
        }
    }
Run Code Online (Sandbox Code Playgroud)

使用它变得非常容易

 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");
Run Code Online (Sandbox Code Playgroud)

  • 拥有一个修改对象内部状态的属性的 getter 似乎非常糟糕的做法(“MoveNext”和“MovePrevious”)。最好让它们发挥作用。还有可以指向无效索引的 `_currentIndex` 似乎很奇怪。最好使用 setter 来纠正索引(而不是让 getter 做同样的工作)。但我仍然喜欢这种方法! (4认同)