我同意伊萬的評論說,在這種情況下變異狀態很容易出現代碼異味。
但是,如果一個會堅持走這條道路,我想至少嘗試封裝狀態突變,如在例如,
(人爲)
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,
簡單的問題,爲什麼?這可能是可行的,但這也意味着重複計算清單中每個項目的相同分鐘數 – Sehnsucht
不要在這裏有一個IDE atm,你可以嘗試:'return userRecords.Where(x => x.FromDate!= userRecords.Min (y => y.FromDate))選擇(x => x.IsInitialRecord = false; return x; });' – Max
@Max是的,這是一個可能的解決方案,但不幸的是我有'SkipWhile'在需要按日期排除最小值並更新其他元素之前,調用以應用請求過濾器。 – user3818229