我想获取列表中的下一个元素,如果列表结束,我想要第一个元素.所以我只想用它来换句话说.
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.
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)
作为对此略有不同的看法,这里有一个扩展方法,您可以使用它来制作任何 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)
这将继续下去...... :)
| 归档时间: |
|
| 查看次数: |
59384 次 |
| 最近记录: |