var query =
from pl in this.Collection
orderby pl.StartDate descending
select pl;
Linq и родительский класс
у меня немного опыта работы с Linq, по этому прошу вашей помощи.
Есть родительский класс VelObject, от него в программе наследуются все остальные используемые объекты (например записи календаря VelPlan).
Задача заключается в том, чтобы в методе класса коллекции VelPlans отсортировать объекты VelPlan по свойству VelPlan.StartDate (по времени короче).
Код:
где Collection - собственно свойство родительского класса List<VelObject>.
Естественно, что в VelObject нет свойства StartDate.
Соответственно вопрос, как использовать linq в наследуемых объектах?
Я нашел только вариант
Код:
var query =
from pl in this.Collection.OfType<VelPlan>()
orderby pl.StartDate descending
select pl;
from pl in this.Collection.OfType<VelPlan>()
orderby pl.StartDate descending
select pl;
но в итоге возвращается 0, хотя до этого коллекция полна. Помогите, пжаласта.
Код:
List<object> Collection = new List<object>()
{
new Plan() { Time = new DateTime(2009, 03, 01) },
new Plan() { Time = new DateTime(2009, 01, 01) },
new Plan() { Time = new DateTime(2009, 04, 01) }
};
var query = from i in Collection
orderby ((Plan)i).Time
select i;
{
new Plan() { Time = new DateTime(2009, 03, 01) },
new Plan() { Time = new DateTime(2009, 01, 01) },
new Plan() { Time = new DateTime(2009, 04, 01) }
};
var query = from i in Collection
orderby ((Plan)i).Time
select i;
P.S. как-то черезчур сурово для сортировки LinQ использовать...
Такой код вполне работает:
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication38 {
public class VelObject {
}
public class VelOther : VelObject {
}
public class VelPlan : VelObject {
public DateTime StartDate {
get;
set;
}
}
public class VelPlanAncestor : VelPlan {
}
class Program {
static void Main(string[] args) {
var c1 = new List<VelObject>(new VelObject[] {
new VelPlanAncestor { StartDate = new DateTime(2010, 3, 7) },
new VelObject(),
new VelPlan() { StartDate = new DateTime(2010, 2, 7) },
new VelPlan() { StartDate = new DateTime(2010, 6, 1) },
new VelPlan() { StartDate = new DateTime(2010, 1, 2) },
new VelPlan() { StartDate = new DateTime(2010, 1, 1) }
});
var c2 = new List<VelPlan>(c1.OfType<VelPlan>());
c2.Sort((a, b) => Comparer<DateTime>.Default.Compare(b.StartDate, a.StartDate));
var c3 = (from p in c1.OfType<VelPlan>()
orderby p.StartDate descending
select p).ToList();
var c4 = c1.OfType<VelPlan>()
.OrderByDescending(p => p.StartDate)
.ToList();
}
}
}
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication38 {
public class VelObject {
}
public class VelOther : VelObject {
}
public class VelPlan : VelObject {
public DateTime StartDate {
get;
set;
}
}
public class VelPlanAncestor : VelPlan {
}
class Program {
static void Main(string[] args) {
var c1 = new List<VelObject>(new VelObject[] {
new VelPlanAncestor { StartDate = new DateTime(2010, 3, 7) },
new VelObject(),
new VelPlan() { StartDate = new DateTime(2010, 2, 7) },
new VelPlan() { StartDate = new DateTime(2010, 6, 1) },
new VelPlan() { StartDate = new DateTime(2010, 1, 2) },
new VelPlan() { StartDate = new DateTime(2010, 1, 1) }
});
var c2 = new List<VelPlan>(c1.OfType<VelPlan>());
c2.Sort((a, b) => Comparer<DateTime>.Default.Compare(b.StartDate, a.StartDate));
var c3 = (from p in c1.OfType<VelPlan>()
orderby p.StartDate descending
select p).ToList();
var c4 = c1.OfType<VelPlan>()
.OrderByDescending(p => p.StartDate)
.ToList();
}
}
}
Оказалось, что коллекция обнулялась не в нужном месте, а я этот момент упустил.
Цитата: Daniel Lavrushin
hardcase, спасибо. Действительно, оказалось, что дело было совсем не в нем, и запрос я писал правильно.
Старайтесь по возможности избегать LINQ, хотя он и позволяет выполнять реляционные операции над объектами в памяти (не спорю, есть ситуации когда это позволяет существенно минимизировать код), он нацелен на работу с БД, и "запросы в памяти" могут нанести серьезный удар по производительности.