Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.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/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
C# 将嵌套循环转换为LINQ_C#_Linq - Fatal编程技术网

C# 将嵌套循环转换为LINQ

C# 将嵌套循环转换为LINQ,c#,linq,C#,Linq,我有一个属性,它有一个DateTime和一个DateTime数组 public DateTime date { get; set; } public DateTime[] dateArray { get; set; } 目前我正在使用嵌套循环来获取我的值,但我试图将其更改为LINQ,但无法正确获取 for (var i = 0; i < allPropertyValues.Count(); i ++) { var list = new List<DateTime

我有一个属性,它有一个
DateTime
和一个DateTime数组

 public DateTime date { get; set; }
 public DateTime[] dateArray { get; set; }
目前我正在使用嵌套循环来获取我的值,但我试图将其更改为LINQ,但无法正确获取

 for (var i = 0; i < allPropertyValues.Count(); i ++)
 {
      var list = new List<DateTime>();
      for (var j = 0; j < allPropertyValues[i].dateArray.Count(); j++)
      {
           if (allPropertyValues[i].dateArray[j]
                 >= allPropertyValues[i].date)
                list.Add(allPropertyValues[i].dateArray);
      }
 }
for(var i=0;i=所有属性值[i]。日期)
添加(allPropertyValues[i].dateArray);
}
}
allPropertyValues
变量当前是一个静态属性数组,在每个索引中,有一个
date
值和多个
dateArray
值。如何使用LINQ迭代每个属性结果并将每个日期与我得到的
dateArray
的多个值进行比较?非常感谢

另外,我如何比较这两个实例,因为我似乎不能使用
尝试下面的linq查询

allPropertyValues.Where(e=> e.dateArray.Any(d=>d>= e.date)).Select(e=>e.dateArray)

遵循以下准则:

  • 从内到外按自己的方式工作
  • 将公共子表达式提取到更简单的内容中
  • 问问自己,循环代表的是什么概念,而不是循环的作用。然后编写一个表示该概念的查询
嗯。我们有我们的内部循环,这是一个混乱。我已经修复了评论中提到的明显错误

  for (var j = 0; j < allPropertyValues[i].dateArray.Count(); j++)
  {
    if (allPropertyValues[i].dateArray[j] >= allPropertyValues[i].date)
      list.Add(allPropertyValues[i].dateArray[j]);
  }
我的天哪,这样更容易理解。现在,代码的含义变得清晰,因此我们可以更轻松地将其转换为查询:

  var v = allPropertyValues[i];
  list.AddRange(from d in v.dateArray where d >= v.date select d);

现在我们只剩下两行非常清晰的代码

现在我们重写了我们的内部循环。将其放入外部循环:

for (var i = 0; i < allPropertyValues.Count(); i++)
{
  var list = new List<DateTime>();
  var v = allPropertyValues[i];
  list.AddRange(v.dateArray.Where(d => d >= v.date));
}
现在我们将整个过程简化为两行程序片段

如果您想要的是列表列表,那么我们可以更进一步:

List<List<DateTime>> lists = allPropertyValues
  .Select(v => v.dateArray.Where(d => d >= v.date).ToList())
  .ToList();
List lists=allPropertyValue
.Select(v=>v.dateArray.Where(d=>d>=v.date.ToList())
.ToList();
我们完成了


这里的要点是:不断地问自己如何简化程序,使其更加清晰和简洁。然后应用一系列仔细、小而正确的重构。每次这样做时,请再次扪心自问:我现在能做得更好吗?

list.Add(allPropertyValue[I].dateArray)
不应该是
list.AddRange(allPropertyValues[i].dateArray)
?为了让我们理解您使用的代码,您没有明确说明要做什么,所以请阅读。Felipe是对的;这种代码是荒谬的。要么是要添加数组中的所有日期,要么更可能是要添加dateArray[j]。是哪一个?非常感谢您的帮助和详细描述。@wrikgee:不客气。循环的问题是,当你想读写的是我对这些数据执行的逻辑操作时,它们会告诉你计算机会做什么?如果您可以将循环编写为查询,您会发现它们更容易理解。@EricLippert代码遍历非常出色
  var v = allPropertyValues[i];
  list.AddRange(from d in v.dateArray where d >= v.date select d);
  var v = allPropertyValues[i];
  list.AddRange(v.dateArray.Where(d => d >= v.date));
for (var i = 0; i < allPropertyValues.Count(); i++)
{
  var list = new List<DateTime>();
  var v = allPropertyValues[i];
  list.AddRange(v.dateArray.Where(d => d >= v.date));
}
for (var i = 0; i < allPropertyValues.Count(); i++)
{
  var v = allPropertyValues[i];
  var list = v.dateArray.Where(d => d >= v.date).ToList();
}
foreach (var v in allPropertyValues)
{
  var list = v.dateArray.Where(d => d >= v.date).ToList();
}
List<List<DateTime>> lists = allPropertyValues
  .Select(v => v.dateArray.Where(d => d >= v.date).ToList())
  .ToList();