如何使用 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,过多的简化会导致维护恐惧并降低可读性:)
是否可以在不使用 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,过多的简化会导致维护恐惧并降低可读性:)