2016-09-24 3 views
0

私は私の質問は機能プログラミングからだと思う。このリストのMIN値以外のオブジェクトのリストを1つのLINQ文で更新できますか?

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

私はローカル変数を使用せずに、それを書き換えたい:私は私のオブジェクトのリストを更新するためのいくつかのコードを書いたところで 。 ありがとうございます!

+3

簡単な質問、なぜですか?それはおそらく実行可能ですが、リスト内の各項目について同じminを繰り返し再計算することを意味します。 – Sehnsucht

+1

ここではIDEを使用しないでください: 'return userRecords.Where(x => x.FromDate!= userRecords.Min ({ x.IsInitialRecord = false; return x; }); – Max

+0

@Maxはい、それは可能な解決策ですが残念ながら私は 'SkipWhile'を持っています日付までに最小値を除外し、他の要素を更新する前に、リクエストフィルターを適用するための呼び出し。 – user3818229

答えて

2

私はIvanのコメントに同意します。その文脈での変異状態は、コードの匂いで終わる傾向があります。

しかし、一つは、その道を行くことを主張するならば、私は、少なくとも例えばのように、状態変異をカプセル化しようと思い、

(不自然)

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、

関連する問題