При помощи LINQ это должно работать;
string delimiter = ",";
List<string> items = new List<string>() { "foo", "boo", "john", "doe" };
Console.WriteLine(items.Aggregate((i, j) => i + delimiter + j));
описание класса:
public class Foo
{
public string Boo { get; set; }
}
Использование:
class Program
{
static void Main(string[] args)
{
string delimiter = ",";
List<Foo> items = new List<Foo>() { new Foo { Boo = "ABC" }, new Foo { Boo = "DEF" },
new Foo { Boo = "GHI" }, new Foo { Boo = "JKL" } };
Console.WriteLine(items.Aggregate((i, j) => new Foo{Boo = (i.Boo + delimiter + j.Boo)}).Boo);
Console.ReadKey();
}
}
И вот мое лучшее :)
items.Select(i => i.Boo).Aggregate((i, j) => i + delimiter + j)
Вы используете его неправильно.
.AddLast (T)
метод возвращает узел связанного списка. Он указывает на ваш день и содержит предыдущие и следующие функции, которые вы ищете.
Во-первых, LinkedListNode
запечатан
, поэтому он не может быть унаследован.
Во-вторых, LinkedListNode
действительно содержит свойства Предыдущие
и Следующие
, которые относятся к предыдущему и следующему узлам в LinkedList
, откуда был получен данный экземпляр LinkedListNode
.
Наконец. , чтобы правильно использовать AddLast
, вы должны сделать следующее:
Day d1 = new Day();
Day d2 = new Day();
LinkedList<Day> days = new LinkedList<Day>();
LinkedListNode<Day> node1 = days.AddLast(d1);
LinkedListNode<Day> node2 = days.AddLast(d2);
// now node1.Next refers to node containing d2
// and node2.Previous referes to node containing d1
Day d1 = new Day();
Day d2 = new Day();
LinkedList<Day> days = new LinkedList<Day>();
// Day's instance doesn't have Next. Its the LinkedListNode that should be used.
LinkedListNode<Day> d1Node = days.AddLast(d1);
days.AddLast(d2);
Согласно MSDN , класс LinkedListNode не может быть унаследован.
Майкл указывает, что это сообщение в блоге Эрика Липперта говорит о том, почему многие классы в структуре закрыты
Почему бы просто не использовать узлы напрямую, чтобы начать с ...
LinkedListNode<Day> d1 = new LinkedListNode<Day>(new Day());
LinkedListNode<Day> d2 = new LinkedListNode<Day>(new Day());
LinkedList<Day> days = new LinkedList<Day>();
days.AddLast(d1);
days.AddLast(d2);
// Now you can read the node directly
d1.Next...
// If you need to place it somewhere other than at the end (like say you want d2 before d1,
// but d1 is already in the list) use 'AddBefore' and 'AddAfter' eg:
days.AddLast(d2);
days.AddBefore(d2, d1);
LinkedListNode - это запечатанный класс, поэтому его нельзя унаследовать . IEnumerable настолько избаловал нас, что мы упускаем из виду фактические структуры данных, которые мы используем. Это по-прежнему связанный список, поэтому вы можете рассматривать его как один:
LinkedListNode<Day> node = days.First();
while (node != null)
{
Day day = node.Value;
// do stuff here...
node = node.Next();
}
Единственный способ, которым я могу придумать, чтобы обобщенный T
знал о своих братьях и сестрах, - это реализовать свою собственную структуру данных.
public interface ILinkedListNode
{
ILinkedListNode Next { get; set; }
ILinkedListNode Previous { get; set; }
}
public class LinkedList<T> where T : ILinkedListNode
{
/*.... methods here ...*/
}
public class Node : ILinkedListNode
{
public Node Next { get; set; }
public Node Previous { get; set; }
ILinkedListNode ILinkedListNode.Next
{
get { return this.Next; }
set { this.Next = (Node)value; }
}
ILinkedListNode ILinkedListNode.Previous
{
get { return this.Previous; }
set { this.Previous = (Node)value; }
}
}