使用LINQ从IEnumerable中删除与List中的项匹配的项

时间:2015-06-17 09:42:08

标签: c# linq

我有一个返回此类IEnumerable的方法:

public class ProductUpdate
{
    public string ProductId { get; set; }
    public DateTime DueDateTime { get; set; }
}

我有一个

List<string>

其中包含日期列表作为字符串。

我要做的是检查任何具有与字符串列表中的项匹配的DueDate值的产品。如果匹配则删除它。

例如:

假设IEnumerable中的ProductUpdate项目PU1具有DueDate 06/07/2015,字符串列表包含60/07/2015,然后从IEnumerable集合中删除PU1。

我可以使用foreach完成它,但我正在寻找LINQ的解决方案。

提前致谢。

4 个答案:

答案 0 :(得分:3)

你去(如果productsUpdates是一个列表):

productsUpdates.RemoveAll(pu => listOfStrings.Any(s => s == pu.DueDateTime.ToString("MM/dd/yyyy"));

如果productsUpdateIEnumerable,请使用此选项:

var result = productsUpdates.Where(pu => listOfStrings.Any(s => s != pu.DueDateTime.ToString("MM/dd/yyyy"));

<强>被修改: 正如Tim Shmelter指出的那样,你可能会在另一种文化中得到错误的结果,因此比较DateTime对象比比较字符串更好(参见他的回答)。 但是,比较DateTime对象还将比较小时,分钟,秒等,这些不包含在您提供的字符串中。如果它们总是空的(空的,我的意思是最小值),没关系,否则你应该使用我的选项。

答案 1 :(得分:1)

所以你想从序列中删除所有ProductUpdate实例,这些实例在字符串列表中根据日期匹配?由于IEnumerable<T>不支持Remove,您必须重新创建它:

productUpates = productUpates
    .Where(pu => !datesList  // your List<string>
        .Any(str => pu.DueDateTime == DateTime.Parse(str, CultureInfo.InvariantCulture)));

如果您需要列表,可以使用productUpates.ToList()

答案 2 :(得分:1)

完整代码

List<ProductUpdate> _products = new List<ProductUpdate>();
_products.Add(new ProductUpdate{ProductId = "Prod1", DueDateTime =  new DateTime(2015,06,12)});
_products.Add(new ProductUpdate{ProductId = "Prod2", DueDateTime =  new DateTime(2015,01,13)});
_products.Add(new ProductUpdate{ProductId = "Prod3", DueDateTime =  new DateTime(2015,09,13)});
_products.Add(new ProductUpdate{ProductId = "Prod4", DueDateTime =  new DateTime(2015,12,18)});
_products.Add(new ProductUpdate{ProductId = "Prod5", DueDateTime =  new DateTime(2015,02,28)});
_products.Add(new ProductUpdate{ProductId = "Prod6", DueDateTime =  new DateTime(2015,08,01)});

List<string> _dueDates =new List<string>();
_dueDates.Add("08/01/2015");

_products.RemoveAll(entry => _dueDates.Any(date => date == entry.DueDateTime.ToString("MM/dd/yyyy"))); 

答案 3 :(得分:0)

尝试这种替代方式

IEnumerable<ProductUpdate> productUpdate ;//Suppose this is your  IEnumerable
List<string> strDates = new List<string> ();//Suppose this is your  List of date string
strDates.Add("06/07/2015");//Add some dates
strDates.Add("06/17/2015");
...
....
productUpdate.Where(a => !str.Contains(a.DueDateTime.ToString("MM/dd/yyyy")));//this gives result what you expecting.