如何使用 LINQ 修改 IEnumerable 以避免 foreach 循环?

How to modify IEnumerable with LINQ to avoid foreach loop?

是否可以在不使用 for 循环的情况下在 LINQ 中以单行方式完成以下操作?

IEnumerable<MyObj> MyList = EF.GetList(etc);
foreach (var row in MyList)
{
    row.uploadedAt = MyUtils.ConvertToLocalTime(row.uploadedAtUTC, clientTimezone);
}
//return MyList, which now has both dates in LocalTime and UTC

重新分配列表,最好不要更改任何内容。这将更符合 LINQ 的 functional programming 思维方式。

IEnumerable<MyObj> myList1 = EF.GetList(etc);
IEnumerable<MyObj> myList2 = myList1.Select( x => 
        new MyObj 
        {
            uploadedAt = MyUtils.ConvertToLocalTime(x.uploadedAtUTC, x.clientTimezone),
            anyOtherFields = x.anyOtherFields
        }
    ).ToList();

如果构造一个MyObj很复杂and/or你真的需要改变它,你也可以这样做:

IEnumerable<MyObj> myList = EF.GetList(etc);
myList = myList.Select( x => {
        x.uploadedAt = MyUtils.ConvertToLocalTime(x.uploadedAtUTC, x.clientTimezone);
        return x;
    }).ToList();

但是如果你打算那样做,你也可以使用 for 循环。

除了给定的答案,还有 List<T> 方法 (reference) 模仿 foreach 循环:

EF.GetList(etc).ToList()
    .ForEach(row => row.uploadedAt = MyUtils.ConvertToLocalTime(row.uploadedAtUTC, clientTimezone));

但我没有看到简化的任何好处,已经足够简单了。

IMO,过多的简化会导致维护恐惧并降低可读性:)