Concat一个分层对象列表

时间:2012-09-11 15:27:09

标签: c# recursion

我有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;

我忘了提到我使用的是开放式泛型而不是封闭型。

抱歉错误信息!

4 个答案:

答案 0 :(得分:1)

for(int i = 0;i < list.Count;++i)
    list[i].Next = i < list.Count - 1 ? list[i + 1] : null;

答案 1 :(得分:1)

您可以像其他人已经建议的那样使用LinkedListElementAtOrDefault

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);

这是演示:http://ideone.com/Qwiwc


  

结果变量不应该是匿名类型。我需要回报   与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);

Tuple Class

答案 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;
}