2013-08-22 62 views
5

我有以下的项目类:筛选大名单

public class Item 
{ 
    public Item() 
    { 
    } 

    public string Id {get; set;} 
    public string Name {get; set;} 
    public string Price {get; set;} 
    public DateTime CreatedDate {get; set;} 

} 

,然后在我的代码我有List<Item> items包含Item类型的项目A LOT,我的问题是你推荐的最佳排序/筛选的基础上CreatedDate以下方案列表中的项目的方法/做法:

  • 的所有项目,其中CreatedDate是之前日期X
  • 所有项目wher后E中的CreatedDate日期X
  • 的所有项目,其中日期x和日期y之间的CreatedDate

附:如果我会提及时间呢?像之前/之后/之间的日期x时间y?

+0

我试过DateTime.Compare基本条件。如果...所以只是想知道是什么最佳答案... –

+0

这看起来相当像一个家庭作业,但不知道:P –

+0

当'DateTime'重载'>','> ='等时,我不会调用'DateTime.Compare'。 –

回答

8

您可以使用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); 

您可以使用像ToList一个foreach或方法来执行查询和物化的结果。

foreach(Item i in beforeDateX) 
    Console.WriteLine("Name:{0} CreatedDate:{1}", i.Name, i.CreatedAt); 
0

你需要看看Enumerable METHODS

用于过滤使用Where

list.Where(x=>x.CreatedDate < yourDate).ToList(); 

对于Ordering

list.OrderBy(x=>x.CreatedDate).ToList(); 
+0

我会在做分支预测友善的where子句之前实际订购它! :) –

+0

我只是告诉他做事的方法。 – Ehsan

0

恕我直言,第三种方式是OK。

但是,如果你不想过滤,你可以在检索你的列表时实现分页。因为如果您放置较大的日期范围,则无法解决性能问题。

2

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

如需订购

var ordrered = items.OrderBy(i => i.CreatedDate); 
0

所有的LINQ方法是伟大的,但他们迭代名单的3倍。如果真的有项目的很多,那么也许一个老式的方式会更有效率(也就是,如果你想一次全部三种情况,否则LINQ答案是要走的路):

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

考虑到你有一个List<>,我建议:

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

之间存在着什么,我建议什么其他建议一个微妙的差异。

.Where方法没有“缓存”返回列表,因此,如果你这样做:

var filtered = items.Where(condition); 

foreach (var item in filtered) 
{ 
} 

foreach (var item in filtered) 
{ 
} 

你的整个列表将被解析两次以搜索使病情真实的项目。为了解决这个“问题”(有时也可能是一个问题),你可以在.Where()

List<>.FindAll()只有选定的项目返回一个新List<>后添加.ToList()。所以你可以列举出你想要的次数,因为它已经“物化”了。

0

你可以使用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(); 
} 

打印:

foo1 foo2的 foo3 foo4 foo5 foo6