在c#中使用lambda表达式查找通用列表

时间:2012-11-28 17:36:47

标签: c# linq

我有这段代码:

List<Visibility> ListVisibility = new List<Visibility>();
    public class Visibility
    {
        public int ShpNo;
        public int QtyShp;
        public int NumPallets;
        public string ETA;            
    }

Visibility item = ListVisibility.Find(VisibItem => VisibItem.ETA == e.Day.Date.ToShortDateString());

但是当有一个符合该条件的项目时,上面的Find不会返回任何Item。

这里可能有什么问题?

3 个答案:

答案 0 :(得分:4)

最有可能的字符串匹配找不到匹配项。更改代码以将日期与DateTime的{​​{3}}部分进行比较,它将有更好的工作机会。

item => DateTime.Parse(item.ETA).Date == e.Day.Date

示例假设e.DayDateTime。此外,您可能需要处理“item.ETA无效日期/空”的情况(即使用DateTime.TryParse)来匹配原始行为。

答案 1 :(得分:2)

有许多事情浮现在脑海中,但最有可能出现两件事:

  1. Visibility.ETA中的字符串是否修剪了前导和尾随空格?

  2. Visibility.ETA中字符串的大小写是否匹配DateTime.ToShortDateString()的字符串?

  3. 如果您将条件更改为:

    var date = e.Day.Date.ToShortDateString();
    var vis = list.Find(
        v => String.Compare(v.ETA, date, StringComparison.OrdinalIgnoreCase) == 0);
    

    是否找到了您要找的物品?如果不是,您应该考虑是否需要将ETA转换为DateTime

答案 2 :(得分:1)

奥卡姆剃刀:您认为有一个项目符合您的条件是不正确的。

您可以验证该方法是否适用于简单测试(使用NUnit)。

[Test]
public void TestFind()
{
     var etaValue = DateTime.Now.Date.ToShortDateString();
     var visibilities = new List<Visibility> { new Visibility { ETA = etaValue } };
     var foundItem = visibilities.Find(x => x.ETA == etaValue);
     Assert.That(foundItem, Is.Not.Null);
}