2016-09-24 61 views
0

我想我的问题来自函数式编程。 顺便说一句,我写一些代码来更新我的对象列表:是否有可能在一个LINQ语句中更新此列表中MIN值以外的对象列表?

var minDate = userRecords.Min(x => x.FromDate); 
return userRecords.Where(x => x.FromDate != minDate).Select(x => 
    { 
     x.IsInitialRecord = false; 
     return x; 
    }); 

我要重写它不使用局部变量。 在此先感谢!

+3

简单的问题,为什么?这可能是可行的,但这也意味着重复计算清单中每个项目的相同分钟数 – Sehnsucht

+1

不要在这里有一个IDE atm,你可以尝试:'return userRecords.Where(x => x.FromDate!= userRecords.Min (y => y.FromDate))选择(x => x.IsInitialRecord = false; return x; });' – Max

+0

@Max是的,这是一个可能的解决方案,但不幸的是我有'SkipWhile'在需要按日期排除最小值并更新其他元素之前,调用以应用请求过滤器。 – user3818229

回答

2

我同意伊万的评论说,在这种情况下变异状态很容易出现代码异味。

但是,如果一个会坚持走这条道路,我想至少尝试封装状态突变,如在例如,

(人为)

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

“HTH,

相关问题