簡體   English   中英

按日期排序兩個不同的對象列表

[英]Order two different list of objects by date

我有2個列出每個不同對象的列表。 每個列表包含一個日期元素。 我想做的是從每個列表中依次提取項目並執行某些操作。

Object1 
{
   string description
   date updateDate
   int value
}

Object2
{
   string description
   date updateDate
   string descritpion2
}

IE瀏覽器

List<object1>
object1.date = 10/1/2017
object1.date = 9/3/2017

List<object2>
object2.date = 10/15/2017
object2.date = 9/1/2017

我想按順序處理這些,所以我將執行列表2對象9/1,列表1對象9/2,列表1對象9/3,列表2對象10/5

一個人怎么能做到這一點?

這個怎么樣?

var list1 = new List<Object1>();
var list2 = new List<Object2>();

var newOrderedByDateCollection = list1
    .Select(i => new TempClass(i, i.updateDate))
    .Concat(list2
        .Select(j => new TempClass(j, j.updateDate)))
    .OrderBy(tmp => tmp.Date)
    .Select(tmp => tmp.OrigItem);
//This could be replaced by a tuple like Tuple<object, DateTime> but I thought this would come across clearer
public class TempClass
{
    public TempClass(object origItem, DateTime date)
    {
        OrigItem = origItem;
        Date = date;
    }
    public object OrigItem { get; set; }
    public DateTime Date { get; set; }
}

現在,您具有類型對象的有序列表。 我看不到這種解決方法,所以當您遍歷該列表時,需要通過執行開關和某種模式匹配來適當地投射每個對象


編輯:為了使人滿意,這里是元組版本(我認為這可能是最好的方式)

var newOrderedByDateCollection = list1
.Select(i => new Tuple<object,DateTime>(i, i.updateDate))
.Concat(list2
    .Select(j => new Tuple<object, DateTime>(j, j.updateDate)))
.OrderBy(tmp => tmp.Item2)
.Select(tmp => tmp.Item1);

如果要保持類型安全(避免object )並且不介意將列表排序為新列表,則可以對兩個索引進行循環:

var l1count = l1.Count;
var l2count = l2.Count;
var ocount = l1count + l2count;
var l1o = l1.OrderBy(o => o.updateDate).ToList();
var l2o = l2.OrderBy(o => o.updateDate).ToList();
for (int j1 = 0, j2 = 0; j1 + j2 < ocount;) {
    if (j1 < l1count && (l1o[j1].updateDate <= l2o[j2].updateDate || j2 >= l2count)) {
        // process l1o[j1]
        ++j1;
    }
    else {
        // process l2o[j2]
        ++j2;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM