我有一个返回此类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的解决方案。
提前致谢。
答案 0 :(得分:3)
你去(如果productsUpdates
是一个列表):
productsUpdates.RemoveAll(pu => listOfStrings.Any(s => s == pu.DueDateTime.ToString("MM/dd/yyyy"));
如果productsUpdate
为IEnumerable
,请使用此选项:
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.