score:0

you need to take a look at enumerable methods

for filtering use the where

list.where(x=>x.createddate < yourdate).tolist();

for ordering

list.orderby(x=>x.createddate).tolist();

score:0

imho the third way is ok.

but if you don't want filter you can implement a pagination when you retrieve your list. because if you put a large date range you don't resolve your performance issue.

score:1

all the linq approaches are great, but they iterate the list 3 times. if there are really lot of items, then maybe an old-fashioned way will be more efficient (that is, if you want all three scenarios at once, otherwise the linq answers are the way to go):

list<item> before = new list<item>();
list<item> after = new list<item>();
list<item> between = new list<item>();

foreach (var item in items)
{
  if (item.createddate <= timebefore)
  {
    before.add(item);
  }
  else if (item.createddate >= timeafter)
  {
    after.add(item);
  }
  else
  {
    between.add(item);
  }
}

score:1

you could use linq where:

static void main(string[] args)
{
    item item1 = new item() { createddate = new datetime(2010, 11, 10), id = "1", name = "foo1", price = "10.00" };
    item item2 = new item() { createddate = new datetime(2010, 11, 11), id = "2", name = "foo2", price = "11.00" };
    item item3 = new item() { createddate = new datetime(2010, 11, 12), id = "3", name = "foo3", price = "12.00" };
    item item4 = new item() { createddate = new datetime(2010, 11, 13), id = "4", name = "foo4", price = "13.00" };
    item item5 = new item() { createddate = new datetime(2010, 11, 14), id = "5", name = "foo5", price = "14.00" };
    item item6 = new item() { createddate = new datetime(2010, 11, 15), id = "6", name = "foo6", price = "15.00" };
    item item7 = new item() { createddate = new datetime(2010, 11, 16), id = "7", name = "foo7", price = "16.00" };
    item item8 = new item() { createddate = new datetime(2010, 11, 17), id = "8", name = "foo8", price = "17.00" };

    list<item> items = new list<item>();
    items.add(item1);
    items.add(item2);
    items.add(item3);
    items.add(item4);
    items.add(item5);
    items.add(item6);
    items.add(item7);
    items.add(item8);

    list<item> filtered = itemsbeforedate(items, new datetime(2010, 11, 16));
    foreach (item i in filtered)
    {
        console.write(i.name);
    }

    console.read();
}

public static list<item> itemsbeforedate(list<item> items, datetime beforedate)
{
    return items.where(i => i.createddate < beforedate).tolist();
}

public static list<item> itemsafterdate(list<item> items, datetime afterdate)
{
    return items.where(i => i.createddate > afterdate).tolist();
}

public static list<item> itemsbetweendates(list<item> items, datetime startdate, datetime enddate)
{
    return items.where(i => i.createddate >= startdate && i.createddate <= enddate).tolist();
}

prints:

foo1 foo2 foo3 foo4 foo5 foo6

score:2

use linq:

var itemsbefore = items.where(i => i.createddate <= timebefore);
var itemsafter = items.where(i => i.createddate >= timeafter);
var itemsbetween = items.where(i => i.createddate >= timestart && i.createddate <= timeend);

for ordering

var ordrered = items.orderby(i => i.createddate);

score:2

considering you have a list<>, i suggest:

list<item> itemsbefore = items.findall(i => i.createddate <= timebefore);
list<item> itemsafter = items.findall(i => i.createddate >= timeafter);
list<item> itemsbetween = items.findall(i => i.createddate >= timestart && i.createddate <= timeend);

there is a subtle difference between what i suggested and what the other have suggested.

the .where method doesn't "cache" the returned list, so if you do:

var filtered = items.where(condition);

foreach (var item in filtered)
{
}

foreach (var item in filtered)
{
}

your whole list will be parsed twice to search for the items that make the condition true. to solve this "problem" (sometimes it could be a problem) you can add a .tolist() after the .where()

the list<>.findall() returns a new list<> with only the selected items. so you can enumerate it how many times you want, because it has been "materialized".

score:9

you can use linq:

var beforedatex = items
    .where(i => i.createddate.date < datex); // remove the .date if you want to include the time
var afterdatex = items
    .where(i => i.createddate.date > datex);
var betweendates = items
    .where(i => i.createddate.date >= datex && i.createddate.date <= datey);

you can use a foreach or methods like tolist to execute the query and materialize the result.

foreach(item i in beforedatex)
    console.writeline("name:{0} createddate:{1}", i.name, i.createdat);

Related Query

More Query from same tag