我有List<T>
,其中T有属性.Next。
列表包含以下数据:
One
Two
Three
Four
Five
我想这样做:
One.Next = Two;
Two.Next = Three;
Three.Next = Four;
Four.Next = Five;
Five.Next为null,因为它是最后一个元素
应该将一个分配给同一类型的单个变量。
如果没有很多ifs / while / hacks,我怎么能这样做?
更新
结果变量不应该是匿名类型。
我需要一个相同类型的返回变量,如IEnumerable&gt;或列表&gt;
我忘了提到我使用的是开放式泛型而不是封闭型。
抱歉错误信息!答案 0 :(得分:1)
for(int i = 0;i < list.Count;++i)
list[i].Next = i < list.Count - 1 ? list[i + 1] : null;
答案 1 :(得分:1)
您可以像其他人已经建议的那样使用LinkedList
或ElementAtOrDefault
:
var result = list.Select((s,i) => new { This=s, Next=list.ElementAtOrDefault(i+1) });
foreach(var x in result)
Console.WriteLine("{0}.{1}",x.This,x.Next);
结果变量不应该是匿名类型。我需要回报 与IEnumerable相同类型的变量&gt;或列表&gt;我也忘记了 提到我使用的是开放式泛型而不是封闭式。
修改:这是使用IEnumerable<Tuple<T, T>>
的另一种方法:
public static IEnumerable<Tuple<TSource, TSource>> ToLinkedSequence<TSource>(this IEnumerable<TSource> input)
{
return input.Select((x,i) => Tuple.Create(x, input.ElementAtOrDefault(i + 1)));
}
你将如何使用它:
var sequence = new[] { "One", "Two", "Three", "Four", "Five" };
var linkedSequence = sequence.ToLinkedSequence();
foreach (var x in linkedSequence)
Console.WriteLine("{0}.{1}", x.Item1, x.Item2);
答案 2 :(得分:0)
您可以创建LinkedList
List<string> s = new List<string> {"one", "two", "three", "four", "five"};
LinkedList<string> ls = new LinkedList<string>(s);
如果您执行 LinkedList.First ,您将获得 LinkedListNode ,并根据需要设置下一步
答案 3 :(得分:0)
public interface INextable<T>
{
public T Next {get;set;}
}
List<MyClass> list = new List<MyClass>(); // Where MyClass implements INextable<MyClass>
var query = list.Zip(list.Skip(1), (a, b) => new
{
First = a,
Second = b
});
foreach (var item in query)
{
item.First.Next = item.Second;
}