Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用LINQ为元组和if else语句重新编写代码_Linq_If Statement_Null - Fatal编程技术网

使用LINQ为元组和if else语句重新编写代码

使用LINQ为元组和if else语句重新编写代码,linq,if-statement,null,Linq,If Statement,Null,在我的C#应用程序中,我使用linq。我需要一个帮助如果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.por

在我的C#应用程序中,我使用linq。我需要一个帮助如果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 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;
                     });
编辑:

@斯坦利是完全正确的,林克是错误的工具。不过,您可以重构代码的一些部分:

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,很难将所有信息嵌入到一个“单行”语句中

您可以使用Linq选择id大于0的trs(例如
Date1.Where(tr=>tr>3)
,但是如果(id>0){…},您在
中如何处理它们
与Linq无关。顺便说一句,
否则如果
阻塞条件将始终为false,因为在这个阶段,tr您可以使用@Roxtar的answerQuestion Updated@Roxtar更新了什么?您仍然在foreach语句中初始化记录变量,这毫无意义。@Roxtar更新了问题,我初始化了re在for each循环外部连接变量。好的,在我的回答中,你有lambda,它根据你的代码片段计算记录。for
//做一些操作。
这取决于你想在这里做什么。在计算记录之前,我需要做一些操作(我需要调用其他函数)。@Roxtar
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 ++;
    }
}