2016-09-24 56 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,

相關問題