我想获取列表中的下一个元素,如果列表结束,我想要第一个元素。 所以我只想用它来换句话。
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];
}
我对上面显示的我自己的解决方案感到非常不满,请告诉我你是否有更好的解决方案:)
答案 0 :(得分:21)
lastAgentIDAarhus = agents[index == -1 ? 0 : index % agents.Count];
使用MOD运算符%可以将索引切换到可能的索引范围。
模运算符是对DIV(/)运算符的补充,并返回两个整数的除法的余数。例如,如果将9除以6,则结果为1,余数为3. MOD运算符请求3。
答案 1 :(得分:11)
或者简单地说:
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];
}
示例:
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
答案 2 :(得分:4)
对此略有不同,这里有一个扩展方法,你可以使用它来制作任何IEnumerable'循环'
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();
}
}
所以你可以像这样使用
var agents = new List<int> {1, 2, 3, 4, 123, 234, 345, 546};
foreach(var i in agents.AsCircularEnumerable())
{
Console.WriteLine(i);
}
将继续......:)
答案 3 :(得分:3)
我喜欢Vinicius's idea使用扩展方法。不幸的是,他发布的代码会引发异常。这是基于他的,但它不会抛出异常,它非常简单易读(恕我直言):
public static T Next<T>(this IList<T> list, T item)
{
var nextIndex = list.IndexOf(item) + 1;
if (nextIndex == list.Count)
{
return list[0];
}
return list[nextIndex];
}
如果传入的项目不在列表中,它将返回列表中的第一项,因为在这种情况下list.IndexOf(item)
将返回-1
;
答案 4 :(得分:2)
没有太大区别,但至少有一些代码(至少在编辑器中); o)
List<int> agents = taskdal.GetOfficeAgents(Branches.aarhusBranch);
if (lastAgentIDAarhus != -1)
{
int index = agents.IndexOf(lastAgentIDAarhus);
lastAgentIDAarhus = (agents.Count > index + 1 ? agents[index + 1] : agents[0]);
}
else
{
lastAgentIDAarhus = agents[0];
}
答案 5 :(得分:1)
如果我们添加一些检查以避免常见错误,您认为怎么样?
public static class ListExtensions
{
public static TType Next<TType>(this IList<TType> list, TType item)
{
if (list == null) return default(TType);
var itemIndex = list.IndexOf(item);
if (itemIndex < 0) return list.FirstOrDefault();
var nextIndex = itemIndex + 1;
return nextIndex >= list.Count
? list.FirstOrDefault()
: list[nextIndex];
}
}
答案 6 :(得分:-4)
string line = lines [lines.FindIndex(x =&gt; x.Contains(item))+ 1];