C# 在c中使用lambda表达式查找泛型列表#
我有以下代码:C# 在c中使用lambda表达式查找泛型列表#,c#,linq,C#,Linq,我有以下代码: List<Visibility> ListVisibility = new List<Visibility>(); public class Visibility { public int ShpNo; public int QtyShp; public int NumPallets; public string ETA; } Visibili
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());
List ListVisibility=new List();
公共类可见性
{
公众谘询服务编号;;
公共int QtyShp;
公共国际货币基金组织;
公共字符串ETA;
}
可见性项=ListVisibility.Find(VisibItem=>VisibItem.ETA==e.Day.Date.ToSortDateString());
但是,当存在与该条件匹配的项时,上述查找不会返回任何项
这里可能有什么问题?最有可能的字符串匹配未找到匹配项。更改代码以将日期作为
DateTime
的一部分进行比较,这样它将有更好的工作机会
item => DateTime.Parse(item.ETA).Date == e.Day.Date
示例假定
e.Day
为DateTime
。此外,您可能需要处理“item.ETA
无效日期/空”的情况(即通过使用DateTime.TryParse
)来匹配原始行为。想到的事情有很多,但最有可能有两个:
Visibility.ETA
中的字符串是否修剪了前导空格和尾随空格Visibility.ETA
中字符串的大小写是否与DateTime.toSortDateString()的大小写匹配
var date = e.Day.Date.ToShortDateString();
var vis = list.Find(
v => String.Compare(v.ETA, date, StringComparison.OrdinalIgnoreCase) == 0);
它找到你要找的东西了吗?如果不是,你应该考虑是否需要转换ETA到<代码> DATETIME> /COD> < < /P> < P>奥卡姆剃须刀:你假设有一个与你的条件匹配的项是不正确的。< /P> 您可以通过一个简单的测试(使用NUnit)验证该方法是否有效
[测试]
公共void TestFind()
{
var etaValue=DateTime.Now.Date.ToSortDateString();
var可视性=新列表{new Visibility{ETA=etaValue};
var foundItem=visibilities.Find(x=>x.ETA==etaValue);
Assert.That(foundItem,Is.Not.Null);
}
您确定与ToSortDateString
返回的确切字符串匹配吗?可能是日期格式的区域设置问题。如果您可以对ETA
进行重构以使用日期时间
而不是字符串,比较会更容易。
[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);
}