[英]Is there a way to conditionally serialize C# list objects based on a property?
[英]Splitting a list of objects based on a property c#
myClass結構:
public class myClass
{
public string Name { get; set; }
public string AdditionalData { get; set; }
public System.DateTime ActivityTime { get; set; }
}
我有一個以上類List<myClass>
的列表,所有這些List<myClass>
均由ActivityTime排序。
我需要拆分上面的列表,並獲取List<List<myClass>>
這樣,如果兩個連續的ActivityTime之間的差異超過特定時間段(例如5分鍾),我希望拆分發生。
真誠的感謝您的幫助。
謝謝
那這個解決方案呢 :
var data = new List<myClass> {
new myClass { ActivityTime = new DateTime(2016, 01, 01, 01, 00, 00) },
new myClass { ActivityTime = new DateTime(2016, 01, 01, 01, 05, 00) },
new myClass { ActivityTime = new DateTime(2016, 01, 01, 01, 06, 00) },
new myClass { ActivityTime = new DateTime(2016, 01, 01, 01, 07, 00) },
new myClass { ActivityTime = new DateTime(2016, 01, 01, 01, 17, 00) }
};
var period = 5;
var firstActivityTime = data.Min(x => x.ActivityTime);
var answer = data.OrderBy(x => x.ActivityTime).GroupBy(x => {
var dif = (x.ActivityTime - firstActivityTime).Minutes;
return dif / period - (dif % period == 0 && dif / period != 0 ? 1 : 0);
}).Select(x => x.ToList()).ToList();
您可以通過簡單的迭代來做到這一點:
var myList = new List<myClass>()
{
new myClass() { Name = "ABC", AdditionalData = "1", ActivityTime = DateTime.Now },
new myClass() { Name = "ABC2", AdditionalData = "2", ActivityTime = DateTime.Now },
new myClass() { Name = "ABC3", AdditionalData = "3", ActivityTime = DateTime.Now.AddSeconds(6) },
new myClass() { Name = "ABC4", AdditionalData = "3", ActivityTime = DateTime.Now.AddSeconds(11) },
new myClass() { Name = "ABC4", AdditionalData = "3", ActivityTime = DateTime.Now.AddSeconds(12) }
};
var results = new List<List<myClass>>();
myClass previousItem = null;
List<myClass> currentList = new List<myClass>();
foreach (var item in myList)
{
if (previousItem == null || (item.ActivityTime - previousItem.ActivityTime).TotalSeconds >= 5)
{
currentList = new List<myClass>();
results.Add(currentList);
}
currentList.Add(item);
previousItem = item;
}
可以實現多種方法,但是基本原理是相同的。 處理第n(th)
元素時,請跟蹤第n-1
個元素,並計算這兩個元素之間的timespan
。
你可以做這樣的事情。
List<MyClass> data = ...; // input
int gid=0;
DateTime prevvalue = data[0].ActivityTime; // Initial value
var result = data.Select(x=>
{
var obj = x.ActivityTime.Subtract(prevvalue).TotalMinutes<5? // Look for timespan difference
new {gid= gid, item =x} // Create groups based on consecutive gaps.
:new {gid= ++gid, item =x};
prevvalue= x.ActivityTime; // Keep track of previous value (for next element process)
return obj;
})
.GroupBy(x=>x.gid) // Split into groups
.Select(x=>x.Select(s=>s.item).ToList())
.ToList();
檢查這個Demo
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.