所以我想從 2 個不同的串列中加入而沒有任何鍵并排序列出一些條件。
我有Class這樣的:
public class DataA
{
public string Data { get; set; }
public int Order { get; set; }
public DateTime CreatedOn { get; set; }
}
public class DataB
{
public string Data { get; set; }
public int Order { get; set; }
public DateTime CreatedOn { get; set; }
}
和這樣的清單:
var listDataA = new List<DataA>
{
new DataA { Data = "data a 1", Order = 1, CreatedOn = new DateTime(2020, 11, 12, 00, 00, 00) },
new DataA { Data = "data a 2", Order = 2, CreatedOn = new DateTime(2020, 11, 13, 00, 00, 00) },
new DataA { Data = "data a 5", Order = 5, CreatedOn = new DateTime(2020, 11, 14, 16, 00, 00) },
new DataA { Data = "data a 6", Order = 6, CreatedOn = new DateTime(2020, 11, 15, 00, 00, 00) },
new DataA { Data = "data a 7", Order = 7, CreatedOn = new DateTime(2020, 11, 16, 00, 00, 00) }
};
var listDataB = new List<DataB>
{
new DataB { Data = "data b 5", Order = 5, CreatedOn = new DateTime(2020, 11, 14, 14, 00, 00) },
new DataB { Data = "data b 8", Order = 8, CreatedOn = new DateTime(2020, 11, 16, 00, 00, 00) }
};
我想從其他Order屬性中訂購串列,如果Order值相同,它將檢查CreatedOn屬性。所以資料看起來像這樣:
[
{ Data = "data a 1", Order = 1, CreatedOn = new DateTime(2020, 11, 12, 00, 00, 00) },
{ Data = "data a 2", Order = 2, CreatedOn = new DateTime(2020, 11, 13, 00, 00, 00) },
{ Data = "data b 5", Order = 5, CreatedOn = new DateTime(2020, 11, 14, 14, 00, 00) },
{ Data = "data a 5", Order = 5, CreatedOn = new DateTime(2020, 11, 14, 16, 00, 00) },
{ Data = "data a 6", Order = 6, CreatedOn = new DateTime(2020, 11, 15, 00, 00, 00) },
{ Data = "data a 7", Order = 7, CreatedOn = new DateTime(2020, 11, 16, 00, 00, 00) },
{ Data = "data b 8", Order = 8, CreatedOn = new DateTime(2020, 11, 16, 00, 00, 00) }
]
我怎樣才能在 Linq 中做到這一點?
uj5u.com熱心網友回復:
真的,我認為你最好為這些類定義一個介面,其中提到你想要使用的公共部分
interface IDataX
{
int Order { get; set; }
DateTime CreatedOn { get; set; }
}
public class DataA: IDataX ...
public class DataB: IDataX ...
那么你可以這樣做
var output = listDataA.Cast<IDataX>().Concat(listDataB).OrderBy(d => d.Order).ThenBy(d => d.CreatedOn);
由于 Data 對兩者都是通用的,您也可以將其添加到介面中,然后您可以使用來自 IDataX 的資料,而無需具體知道下面的物件是 DataA 還是 DataB。
如果您反對這一點(并且也反對為 A/B 建立一個具有共同屬性 Order/Created..此處呈現的不是為了示例):
class Holder{
public int Order { get; set; }
public DateTime CreatedOn { get; set; }
public object OriginalData { get; set; }
}
和連續預測..
listA
.Select(a => new Holder { Order = a.Order, CreatedOn = a.CreatedOn, OriginalData = a})
.Concat(
listB.Select(b => new Holder { Order = b.Order, CreatedOn = b.CreatedOn, OriginalData = b})
).OrderBy(x => x.Order).ThenBy(x => x.CreatedOn)
..then cast back the OriginalDatawhen you want to use it..(if(x.OriginalData is DataA a) ... else if(x.OriginalData is DataB b)這有點..呃)
就個人而言,我肯定會為此利用某種多型性
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/356560.html
上一篇:何時使用Microsoft.Data.SqlClient.SqlException與System.Data.SqlClient.SqlException?
下一篇:C#從IF陳述句中獲取結果
