列表<>获取下一个元素或获取第一个元素

The*_*ter 15 c#

我想获取列表中的下一个元素,如果列表结束,我想要第一个元素.所以我只想用它来换句话说.

   List<int> agents = taskdal.GetOfficeAgents(Branches.aarhusBranch);
    if (lastAgentIDAarhus != -1)
    {
        int index = agents.IndexOf(lastAgentIDAarhus);
        if (agents.Count > index + 1)
        {
            lastAgentIDAarhus = agents[index + 1];
        }
        else
        {
            lastAgentIDAarhus = agents[0];
        }
    }
    else
    {
        lastAgentIDAarhus = agents[0];
    }
Run Code Online (Sandbox Code Playgroud)

我对上面显示的自己的解决方案感到非常不满,请告诉我你是否有更好的解决方案:)

Pau*_*der 22

lastAgentIDAarhus = agents[index == -1 ? 0 : index % agents.Count];
Run Code Online (Sandbox Code Playgroud)

使用MOD运算符% atuomatically将索引切断到可能索引的范围.

模运算符是对DIV(/)运算符的补充,并返回两个整数的除法的余数.例如,如果将9除以6,则结果为1,余数为3. MOD运算符要求3.

  • 我认为它应该是`index%(agents.Count)` (3认同)
  • @EricYin:你的伯爵总是比你拥有的最高指数高1.这是因为(通常)索引从0开始,而Count属性从1开始. (3认同)

Vin*_*ves 13

或者干脆:

public static T NextOf<T>(this IList<T> list, T item)
{
    var indexOf = list.IndexOf(item);
    return list[indexOf == list.Count - 1 ? 0 : indexOf + 1];
}
Run Code Online (Sandbox Code Playgroud)

例:

List<string> names = new List<string>();

names.Add("jonh");
names.Add("mary");

string name = String.Empty;    

name = names.NextOf(null);   //name == jonh

name = names.NextOf("jonh"); //name == mary

name = names.NextOf("mary"); //name == jonh
Run Code Online (Sandbox Code Playgroud)


Ste*_*ock 5

作为对此略有不同的看法,这里有一个扩展方法,您可以使用它来制作任何 IEnumerable 'circular'

  public static IEnumerable<T> AsCircularEnumerable<T>(this IEnumerable<T> enumerable)
  {
    var enumerator = enumerable.GetEnumerator();
    if(!enumerator.MoveNext())
      yield break;

    while (true)
    {
      yield return enumerator.Current;
      if(!enumerator.MoveNext())
        enumerator = enumerable.GetEnumerator();
    }
  }
Run Code Online (Sandbox Code Playgroud)

所以你可以像这样使用它

  var agents = new List<int> {1, 2, 3, 4, 123, 234, 345, 546};

  foreach(var i in agents.AsCircularEnumerable())
  {
    Console.WriteLine(i);
  }
Run Code Online (Sandbox Code Playgroud)

这将继续下去...... :)