Linq表达式将数组的所有值设置为给定值

时间:2009-09-11 20:54:21

标签: c# linq lambda

我有一些代码,我想变成一个linq表达式(最好使用lambdas),以便更容易用作委托。代码如下所示:

List<DateTime[]> changes = new List<DateTime[]>();
changes = PopulateChanges();
for (int i = 0; i < changes.Count; i++)
{
    for(int j = 0; j < changes[i].Length; j++)
    {
        changes[i][j] = DateTime.MinValue;
    }
}

对于我的生活,我似乎无法想出这个。我尝试过使用ForEach和各种形式的选择等等。似乎没什么用。

仅供参考,我知道DateTime默认为MinValue,实际上这是在已经设置之后将数组清除为默认值。

任何人都可以用工作表达来帮助我吗?

编辑:

我想我在这里说的是我想要一种简洁的方法将多维数组的所有元素设置为给定值。当然,嵌套的for循环可以工作,我当然可以把它放在一个函数中(我已经完成了)。我只想要一些更简洁的东西,可以更容易地在代表中使用,而不会创建一个多行怪物。

5 个答案:

答案 0 :(得分:14)

这应该可以解决问题。

它不是LINQ,它与嵌套的for循环没有太大区别,只是略微冗长。

changes.ForEach(x => Array.Clear(x, 0, x.Length));

有一些方法(ab)使用LINQ来实现相同的结果,但我认为它们是脏的黑客。此外,LINQ等价物可能不会比上面的例子更简洁。

答案 1 :(得分:2)

LINQ实际上并不打算用于更新集合。 它是关于查询,即在现有集合上创建枚举。 我认为你的代码是完全可读的,并且如果强迫它有很多lambda等等,它们就不会有太大的改进。

如果要创建一个新的List<DateTime[]>,并将每个元素设置为一个值,您可以这样做:

var changes = Enumerable.Range(0, width)
                        .Select(x => Enumerable.Range(0, height)
                                               .Select(y => DateTime.MinValue)
                                               .ToArray())
                        .ToList();

如果确实希望使用ForEach / LINQ执行此操作,则可能会滥用Select(但我不推荐):

changes.ForEach(array => array.Select((dt, i) => array[i] = DateTime.Now)
                              .LastOrDefault());

答案 2 :(得分:2)

一个有趣的问题,但是Linq关于查询,你在这里做的事情看起来不像是对我的查询。即使有解决方案,我也不确定我是否会使用Linq这样的东西。

答案 3 :(得分:0)

您能描述一下您建议如何使用该代表的一些用例吗?

我的意思是,如果PopulateChanges()返回一个List&lt;&gt;在DateTime数组中,您将浏览所有这些并将它们设置为DateTime.MinValue,您想要在代理中放置的代码单元究竟是什么?

答案 4 :(得分:0)

总有最好的做法,但我不知道我是否同意每个人都说的一切......

如果我理解正确你必须枚举你的嵌套数组有几个不同的原因,并希望封装该功能以便重用。有几种不同的方法可以实现,但这里有一个使用linq,一个使用out ..

List<DateTime[]> changes = new List<DateTime[]>();
changes = PopulateChanges();

// *** As pointed out ForEach this will not change the value in the array, Thanks!***
changes.ForEach(change => change.ToList().ForEach(date => date = DateTime.MinValue));

// this how ever works but is kind of confusing...
changes = changes.Select(change => change.Select(date => DateTime.MinValue).ToArray()).ToList();
//Even that would get old writing it over and over again...

我会这样做......

private void ForEachOnNestedDates(List<DateTime[]> list, Func<DateTime, DateTime> method)
{
   // Use your code...
   for (int i = 0; i < list.Count; i++)
   {
      for(int j = 0; j < list[i].Length; j++)
      {
          list[i][j] = method.Invoke(list[i][j]);
      }
   }
}

这将允许您重复使用它并对每个项目执行不同的操作。离。

//Add a Day to each datetime value
ForEachOnNestedDates(changes, (DateTime date) => date.AddDays(1));

//You also make it even more readable
ForEachOnNextedDates(changes, DoSomethingWithDate);

private DateTime DoSomethingWithDate(DateTime value)
{

}

这将用于每个日期时间完成的事情,而不是每个日期时间完成的事情......这将略有不同。