C# 是否可以在一个LINQ语句中更新除此列表中的最小值以外的对象列表?
我想我的问题来自函数式编程。 顺便说一下,我写了一些代码来更新我的对象列表:C# 是否可以在一个LINQ语句中更新除此列表中的最小值以外的对象列表?,c#,linq,functional-programming,C#,Linq,Functional Programming,我想我的问题来自函数式编程。 顺便说一下,我写了一些代码来更新我的对象列表: var minDate = userRecords.Min(x => x.FromDate); return userRecords.Where(x => x.FromDate != minDate).Select(x => { x.IsInitialRecord = false; return x; }); 我想在不使用局部变量的情况下重写它。 提前
var minDate = userRecords.Min(x => x.FromDate);
return userRecords.Where(x => x.FromDate != minDate).Select(x =>
{
x.IsInitialRecord = false;
return x;
});
我想在不使用局部变量的情况下重写它。
提前谢谢 我同意Ivan的评论,即在这种情况下,变异状态很容易最终变成代码气味 但如果有人坚持这样做,我至少会尝试封装状态突变,例如 (人为的)
“嗯,我同意Ivan的评论,即在这种情况下,变异状态很容易以代码气味结束 但如果有人坚持这样做,我至少会尝试封装状态突变,例如 (人为的)
“嗯,简单的问题,为什么?这可能是可行的,但这也意味着要为列表中的每个项目反复计算相同的最小值。如果没有IDE,请尝试:
returnuserrecords.Where(x=>x.FromDate!=userRecords.min(y=>y.FromDate))。选择(x=>{x.IsInitialRecord=false;return x;})
@Max Yep,这是一个可能的解决方案,但不幸的是,在我需要按日期排除最小值并更新其他元素之前,我有跳过调用以应用请求筛选器。阅读所用标记的说明:函数编程是一种基于使用函数构建抽象的编程范式,避免副作用和状态变化。。我们在你们的代码中看到的——使用选择的副作用,变异状态。。。顺便说一句,为了“更新你的对象列表”,必须有人对你的方法的结果进行foreach
,这也很奇怪。简单的问题,为什么?这可能是可行的,但这也意味着要为列表中的每个项目反复计算相同的最小值。如果没有IDE,请尝试:returnuserrecords.Where(x=>x.FromDate!=userRecords.min(y=>y.FromDate))。选择(x=>{x.IsInitialRecord=false;return x;})
@Max Yep,这是一个可能的解决方案,但不幸的是,在我需要按日期排除最小值并更新其他元素之前,我有跳过调用以应用请求筛选器。阅读所用标记的说明:函数编程是一种基于使用函数构建抽象的编程范式,避免副作用和状态变化。。我们在你们的代码中看到的——使用选择的副作用,变异状态。。。顺便说一句,为了“更新您的对象列表”,必须有人对您的方法的结果进行foreach
,这也很奇怪。
public class UserRecord
{
public UserRecord(DateTime fromDate)
{
FromDate = fromDate;
AfterUpdate(true);
}
public UserRecord AfterUpdate(bool initialRecord)
{
IsInitialRecord = initialRecord;
return this;
}
public DateTime FromDate { get; private set; }
public bool IsInitialRecord { get; private set; }
}
public static void Main(string[] args)
{
var userRecords =
new[]
{
new UserRecord(new DateTime(1900, 1, 1)),
new UserRecord(new DateTime(1801, 1, 1)),
new UserRecord(new DateTime(1913, 1, 1)),
new UserRecord(new DateTime(1850, 1, 1))
};
var updatedRecords =
(
from minDate in new[] { userRecords.Min(r => r.FromDate) }
from record in userRecords
where record.FromDate > minDate
select record.AfterUpdate(false)
);
foreach (var record in updatedRecords)
{
Console.WriteLine("{0} ({1})", record.FromDate, record.IsInitialRecord);
}
// Etc...
}