使用 LINQ 对元组和 if else 语句进行代码重温



在我的C#应用程序中,我正在使用linq。我需要帮助,if-elseif-在单行中使用linq的语法是什么。数据,范围日期是输入。这是代码:

var Date1 = RangeData.ToList();
int record =0;
foreach (var tr in Date1)
{
int id =0;
if (tr.Item1 != null && tr.Item1.port != null)
{
id = tr.Item1.port.id;
}
else if (tr.Item2 != null && tr.Item2.port != null)
{
id = tr.Item2.port.id;
}
if (id >0)
{
if(Data.Trygetvalue(id, out cdat)
{ 
// Do some operation. (var cdata = SumData(id, tr.item2.port.Date)
record ++;
}
}
}

我认为您的代码示例是错误的,您的记录变量在每个循环中初始化为 0,因此递增它是无用的.

我想您想计算列表中具有 id 的记录,您可以通过一个Count()来实现这一点:

var record = Date1.Count(o => (o.Item1?.port?.id ?? o.Item2?.port?.id) > 0);

您可以使用以下代码:

var count = RangeData.Select(x => new { Id = x.Item1?.port?.id ?? x.Item2?.port?.id ?? 0, Item = x })
.Count(x =>
{
int? cdate = null; // change int to your desired type over here
if (x.Id > 0 && Data.Trygetvalue(x.Id, out cdat))
{
// Do some operation. (var cdata = SumData(x.Id, x.Item.Item2.port.Date)
return true;
}
return false;
});

编辑:

@D Stanley 是完全正确的,但 LINQ 在这里是错误的工具。不过,您可以重构代码的几位:

var Date1 = RangeData.ToList();
int record =0;
foreach (var tr in Date1)
{
int? cdat = null; // change int to your desired type over here
int id = tr.Item1?.port?.id ?? tr.Item2?.port?.id ?? 0;
if (id >0 && Data.Trygetvalue(id, out cdat))
{ 
// Do some operation. (var cdata = SumData(id, tr.Item2.port.Date)
record ++;
}
}

Linq在这里不是正确的工具。Linq 用于转换查询集合。您正在循环访问集合并"执行一些操作"。根据该操作的内容,尝试将其硬塞到 Linq 语句中将更难被外部读者理解、难以调试且难以维护。

您拥有的循环绝对没有问题。正如您从其他答案中可以看出的那样,很难将您拥有的所有信息都楔入一个"单行"语句中,以便使用 Linq。

相关内容

  • 没有找到相关文章

最新更新