6

我有以下项目类:

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中包含A LOTtype 的项目Item,我的问题是您推荐的最佳方法/实践,基于 CreatedDate 在以下情况下对列表中的项目进行排序/过滤:

  • CreatedDate 在日期 x 之前的所有项目
  • 日期 x 之后 CreatedDate 的所有项目
  • CreatedDate 在日期 x 和日期 y 之间的所有项目

PS如果我也提到时间呢?就像在日期 x 时间 y 之前/之后/之间一样?

4

7 回答 7

9

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

您可以使用一个foreach或类似的方法ToList来执行查询并具体化结果。

foreach(Item i in beforeDateX)
    Console.WriteLine("Name:{0} CreatedDate:{1}", i.Name, i.CreatedAt);
于 2013-08-22T08:57:04.790 回答
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);
于 2013-08-22T08:58:14.547 回答
2

考虑到你有一个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)
{
}

您的整个列表将被解析两次以搜索使条件为真的项目。要解决这个“问题”(有时可能是一个问题),您可以.ToList().Where()

List<>.FindAll()返回一个List<>只包含所选项目的新项目。所以你可以枚举你想要多少次,因为它已经“物化”了。

于 2013-08-22T09:10:03.923 回答
1

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

印刷:

富1 富2 富3 富4 富5 富6

于 2013-08-22T09:10:31.193 回答
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);
  }
}
于 2013-08-22T09:01:54.410 回答
0

你需要看看Enumerable METHODS

对于过滤使用Where

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

订购_

list.OrderBy(x=>x.CreatedDate).ToList();
于 2013-08-22T08:57:18.200 回答
0

恕我直言,第三种方式是可以的。

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

于 2013-08-22T08:57:44.127 回答