我正在使用C#并使用排序的List<T>
结构。我正在尝试遍历List
,并且每次迭代我都想访问列表的下一个成员。有没有办法做到这一点?
伪代码示例:
foreach (Member member in List)
{
Compare(member, member.next);
}
答案 0 :(得分:54)
你做不到。使用for代替
for(int i=0; i<list.Count-1; i++)
Compare(list[i], list[i+1]);
答案 1 :(得分:17)
您可以改为保留之前的值:
T prev = default(T);
bool first = true;
foreach(T item in list) {
if(first) {
first = false;
} else {
Compare(prev, item);
}
prev = item;
}
答案 2 :(得分:4)
如果有人如此倾向,你也可以为此编写一个扩展方法......
public static void ForEachNext<T>(this IList<T> collection, Action<T, T> func)
{
for (int i = 0; i < collection.Count - 1; i++)
func(collection[i], collection[i + 1]);
}
用法:
List<int> numList = new List<int> { 1, 3, 5, 7, 9, 11, 13, 15 };
numList.ForEachNext((first, second) =>
{
Console.WriteLine(string.Format("{0}, {1}", first, second));
});
答案 3 :(得分:3)
使用带索引的常规for循环,并比较list [i]和list [i + 1]。 (但请确保只循环到倒数第二个索引。)
或者,如果你真的想要使用foreach,你可以保留一个成员引用前一个成员并在下一次检查。但我不推荐它。
答案 4 :(得分:2)
LINQ可能是你的朋友。这种方法适用于任何IEnumerable&lt; T&gt;,而不仅仅是IList&lt; T&gt;。集合,如果您的集合永远不会结束或以其他方式即时计算,这非常有用:
class Program {
static void Main(string[] args) {
var list = new List<Int32> { 1, 2, 3, 4, 5 };
foreach (var comparison in list.Zip(list.Skip(1), Compare)) {
Console.WriteLine(comparison);
}
Console.ReadKey();
}
static Int32 Compare(Int32 first, Int32 second) {
return first - second;
}
}
答案 5 :(得分:1)
XmlNode root = xdoc.DocumentElement;
XmlNodeList nodeList = root.SelectNodes("descendant::create-backup-sets/new-file-system-backup-set");
for (int j = 0; j < nodeList.Count; j++ )
{
for (int i = 0; i <= nodeList.Item(j).ChildNodes.Count - 1; i++)
{
if (nodeList.Item(j).ChildNodes[i].Name == "basic-set-info")
{
if (nodeList.Item(j).ChildNodes[i].Attributes["name"].Value != null)
{
// retrieve backup name
_bName = nodeList.Item(j).ChildNodes[i].Attributes["name"].Value.ToString();
}
}