Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.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_Functional Programming - Fatal编程技术网

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...
    }