Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 按日期排列两个不同的对象列表_C#_Linq - Fatal编程技术网

C# 按日期排列两个不同的对象列表

C# 按日期排列两个不同的对象列表,c#,linq,C#,Linq,我有两个不同对象的列表。每个列表都包含一个日期元素。我想做的是按顺序从每个列表中提取项目,然后做一些事情 Object1 { string description date updateDate int value } Object2 { string description date updateDate string descritpion2 } 即 列表 object1.date=10/1/2017 object1.date=2017年9月3日 列

我有两个不同对象的列表。每个列表都包含一个日期元素。我想做的是按顺序从每个列表中提取项目,然后做一些事情

Object1 
{
   string description
   date updateDate
   int value
}

Object2
{
   string description
   date updateDate
   string descritpion2
}

列表
object1.date=10/1/2017
object1.date=2017年9月3日
列表
object2.date=2017年10月15日
object2.date=2017年9月1日
我想按顺序处理这些,所以我要做列表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 list1=新列表();
var list2=新列表();
var newOrderedByDateCollection=list1
.Select(i=>newtempClass(i,i.updateDate))
.Concat(列表2)
.Select(j=>newtempClass(j,j.updateDate)))
.OrderBy(tmp=>tmp.Date)
.Select(tmp=>tmp.OrigItem);
//这可以被类似于tuple的tuple替换,但我认为这会更清晰
公共课临时课
{
公共临时类(对象源项、日期时间日期)
{
OrigItem=OrigItem;
日期=日期;
}
公共对象OrigItem{get;set;}
公共日期时间日期{get;set;}
}
现在您有了一个对象类型的有序列表。我看不出有什么方法可以绕过它,所以在遍历该列表时,需要通过切换和一些模式匹配来适当地将每个对象强制转换回来


编辑:为了方便起见,这里是元组版本(我认为这可能是最好的方法)

var newOrderedByDateCollection=list1
.Select(i=>newtuple(i,i.updateDate))
.Concat(列表2)
.Select(j=>newtuple(j,j.updateDate)))
.OrderBy(tmp=>tmp.Item2)
.Select(tmp=>tmp.Item1);

如果您想保持类型安全(避免
对象
),并且不介意将列表排序为新列表,您可以使用两个索引执行循环:

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;
    }
}
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();
对于(int j1=0,j2=0;j1+j2
提供一些关于您目前尝试的代码。
foreach(list1.Concat(list2.OrderBy(d=>d)中的var-date){}
是因为我还是每个人都忘记了C#是类型安全的?如果它们是两个独立的类型,不共享基类或接口,那么它们只能组合在一个类型对象集合中,这意味着OP无法获取日期属性。你可以发布实际代码而不是janky伪代码吗?@Dave没有人忘记这一点。OP在我们发表评论后的编辑中添加了该信息。
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);
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;
    }
}