Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/77.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
C# 使用C将两个循环转换为单个LINQ查询#_C#_.net_Linq_For Loop - Fatal编程技术网

C# 使用C将两个循环转换为单个LINQ查询#

C# 使用C将两个循环转换为单个LINQ查询#,c#,.net,linq,for-loop,C#,.net,Linq,For Loop,我在这里搜索了一些链接以将嵌套循环更改为单个Linq,我尝试使用这些链接,部分代码不起作用,我需要一些专家指导来修复此问题 更新1: 我猜我的解释不清楚,循环工作正常!正如预期的那样,我得到了正确的结果,但我正在进行优化,而不是使用两个循环,我需要将相同的代码转换为单个linq 代码如下: foreach (var ob in all_request_list.Where(x => x.StartDate != x.EndDate)) { int consq_dates = ob.

我在这里搜索了一些链接以将嵌套循环更改为单个Linq,我尝试使用这些链接,部分代码不起作用,我需要一些专家指导来修复此问题

更新1:

我猜我的解释不清楚,循环工作正常!正如预期的那样,我得到了正确的结果,但我正在进行优化,而不是使用两个循环,我需要将相同的代码转换为单个linq

代码如下:

foreach (var ob in all_request_list.Where(x => x.StartDate != x.EndDate)) {
    int consq_dates = ob.EndDate.DateDiff(ob.StartDate);                
    for (int i = 0; i <= consq_dates; i++) {
        combined_list.Add(new { ShiftID = ob.ShiftID, SkillID = ob.SkillID, EmployeeID = ob.EmployeeID, AssignDate = ob.StartDate.AddDays(i), ProfileID = ob.ProfileID });
    }
}
foreach(所有请求列表中的var ob.Where(x=>x.StartDate!=x.EndDate)){
int consq_dates=ob.EndDate.DateDiff(ob.StartDate);

对于(int i=0;i我不知道您会遇到什么错误,但这可能是因为某些函数无法在linq语句中执行,因为它在内部将其转换为sql。请尝试以下操作:

foreach (var ob in all_request_list.Where(x => x.StartDate != x.EndDate))
        {
            int consq_dates = ob.EndDate.DateDiff(ob.StartDate);                
            for (int i = 0; i <= consq_dates; i++)
            {
                var newDate = ob.StartDate.AddDays(i);
                combined_list.Add(new { ShiftID = ob.ShiftID, SkillID = ob.SkillID, EmployeeID = ob.EmployeeID, AssignDate = newDate , ProfileID = ob.ProfileID });
            }
        }
foreach(所有请求列表中的var ob.Where(x=>x.StartDate!=x.EndDate))
{
int consq_dates=ob.EndDate.DateDiff(ob.StartDate);

对于(inti=0;i这就是您要寻找的吗

var items = from ob in all_request_list
            where ob.StartDate != ob.EndDate
            let consq_dates = ob.EndDate.DateDiff(ob.StartDate)
            from i in Enumerable.Range(0, consq_dates + 1)
            select new { ShiftID = ob.ShiftID, SkillID = ob.SkillID, EmployeeID = ob.EmployeeID, AssignDate = ob.StartDate.AddDays(i), ProfileID = ob.ProfileID };
combined_list.AddRange(items);
但是:你有可以工作的代码。你理解这些代码。你为什么不改变它们?顺便说一句:你的两个循环将比linq快。

你可以使用以下
linq

它所做的就是为
所有请求列表中的每个项目创建一个
IEumerable
结果。其中
使用(这是替换
for
循环的部分),然后使用该方法将其展平


在可读性/可维护性方面,它可能比
for
循环要好,但请记住
Linq
tl;dr:了解
Linq
在内部做什么以及在您的情况下它将做什么
).

您会遇到什么错误?组合列表处理的类型是什么?我很确定您不能将在
add
调用中使用的匿名类型添加到该列表中。唯一的方法可能是
列表
列表
。也许这就是问题所在。您为什么要在一个日期中添加0天?@Neil开始一次约会t那天可能(包括范围)已经更新了解释,请看一看。@Neil,添加0将占用当天的时间。上面的代码绝对有效,没有错误,我需要使用linq优化代码。你怎么知道它将被翻译成SQL?OP没有提到SQL或数据库。他们的意思是linq被翻译成exp假设试图在if语句的表达式块内编写一个for循环
if(for(…){}
。编译器不会接受它。LINQ表达式是一样的,只是完全分散。你错过了这里的右括号
Enumerable.Range(0,x.EndDate.DateDiff(x.StartDate)
。您应该添加
+1
来计算最后日期我在linq方面很好,但我更喜欢使用查询语法。查看代码时遇到的问题是:您确定可以在
中访问
x
。选择(y=>…
-lambda?您可以这样做,因为
x
是为
SelectMany
的范围定义的,它只在
Select
行的末尾结束。这是个人偏好的问题,我不喜欢阅读查询语法,所以我试图避免它们。哦,对不起,我读错了右括号。对不起,我的错。现在清楚了。我知道了您使用的是where而不是selectmany,最后是select。但是select在selectmany中。哦!真的,我不知道两个循环会比linq快,有没有办法检查哪一个运行得更快?我不确定这个问题是否在这个范围内。请使用秒表检查
var items = all_request_list
    .Where(x => x.StartDate != x.EndDate)
    .SelectMany(x => Enumerable.Range(0, x.EndDate.DateDiff(x.StartDate) + 1)
        .Select(y => new { ShiftID = x.ShiftID, SkillID = x.SkillID, EmployeeID = x.EmployeeID, AssignDate = x.StartDate.AddDays(y), ProfileID = x.ProfileID }))

combined_list.AddRange(items);