假設我有這個物件串列:
var shipments = new List<ShipmentTracking>() {
new ShipmentTracking() {
trackingNumber = "32021001000", trackings = new List<Tracking>() {
new Tracking() { trackingCode = "EBC", trackingPoint = "Entered", trackingDateTime = DateTime.Now, trackingMemo = "" }
}
},
new ShipmentTracking() {
trackingNumber = "32021001001", trackings = new List<Tracking>() {
new Tracking() { trackingCode = "EBC", trackingPoint = "Entered", trackingDateTime = DateTime.Now.AddDays(1), trackingMemo = "" },
new Tracking() { trackingCode = "AWB", trackingPoint = "Registered", trackingDateTime = DateTime.Now.AddDays(1), trackingMemo = "" }
}
},
new ShipmentTracking() {
trackingNumber = "32021001002", trackings = new List<Tracking>() {
new Tracking() { trackingCode = "EBC", trackingPoint = "Entered", trackingDateTime = DateTime.Now.AddDays(2), trackingMemo = "" },
new Tracking() { trackingCode = "AWB", trackingPoint = "Registered", trackingDateTime = DateTime.Now.AddDays(2), trackingMemo = "" },
new Tracking() { trackingCode = "DSP", trackingPoint = "Shipped", trackingDateTime = DateTime.Now.AddDays(2), trackingMemo = "" }
}
},
new ShipmentTracking() {
trackingNumber = "32021001003", trackings = new List<Tracking>() {
new Tracking() { trackingCode = "EBC", trackingPoint = "Entered", trackingDateTime = DateTime.Now.AddDays(3), trackingMemo = "" },
new Tracking() { trackingCode = "AWB", trackingPoint = "Registered", trackingDateTime = DateTime.Now.AddDays(3), trackingMemo = "" },
new Tracking() { trackingCode = "DSP", trackingPoint = "Shipped", trackingDateTime = DateTime.Now.AddDays(3), trackingMemo = "" },
new Tracking() { trackingCode = "CCI", trackingPoint = "Cleared", trackingDateTime = DateTime.Now.AddDays(3), trackingMemo = "" }
}
},
new ShipmentTracking() {
trackingNumber = "32021001003", trackings = new List<Tracking>() {
new Tracking() { trackingCode = "EBC", trackingPoint = "Entered", trackingDateTime = DateTime.Now.AddDays(4), trackingMemo = "" },
new Tracking() { trackingCode = "AWB", trackingPoint = "Registered", trackingDateTime = DateTime.Now.AddDays(4), trackingMemo = "" },
new Tracking() { trackingCode = "DSP", trackingPoint = "Shipped", trackingDateTime = DateTime.Now.AddDays(4), trackingMemo = "" },
new Tracking() { trackingCode = "CCI", trackingPoint = "Cleared", trackingDateTime = DateTime.Now.AddDays(4), trackingMemo = "" },
new Tracking() { trackingCode = "POD", trackingPoint = "Delivered", trackingDateTime = DateTime.Now.AddDays(4), trackingMemo = "" }
}
}
};
我需要的查詢將檢查并僅回傳具有 trackingCode == "DSP" 但不回傳帶有 "CCI" 或 "POD" trackingCode 的貨物跟蹤的貨件跟蹤,因此在此示例中,帶有跟蹤號 32021001002 的貨件跟蹤將是一。
我試過這個,但似乎不起作用:
foreach (var shipment in shipments)
{
var foo = shipment.trackings.FirstOrDefault((t => t.trackingCode == "DSP" && t.trackingCode != "CCI"));
if (shipment.trackings.Contains(foo))
{
}
}
任何幫助或指標表示贊賞。謝謝!
uj5u.com熱心網友回復:
您想要貨件 的跟蹤串列:有任何跟蹤代碼“DSP”并且沒有任何跟蹤代碼“CCI”
shipments.Where(s =>
s.Trackings.Any(t => t.TrackingCode == "DSP") &&
!s.Trackings.Any(t => t.TrackingCode == "CCI")
);
你也可以這樣寫:
shipments.Where(s =>
s.Trackings.Any(t => t.TrackingCode == "DSP") &&
s.Trackings.All(t => t.TrackingCode != "CCI")
);
即有任何跟蹤代碼是 DSP,并且所有跟蹤代碼都不是 CCI 的貨件”
使用對您更有意義的那個
uj5u.com熱心網友回復:
有 trackingCode == "DSP" 但沒有使用 "CCI" 或 "POD" 進行貨件追蹤
我會填充兩個集合以簡化它并使其易于更改:
var validCodes = new List<string>{"DSP"};
var invalidCodes = new List<string>{"CCI", "POD"};
如果你想忽略這種情況,那么對待dsp和DSP你需要的一樣StringComparer.OrdinalIgnoreCase,否則StringComparer.Ordinal。
查詢非常簡單:
List<ShipmentTracking> trackingList = shipments
.Where(st => st.trackings.Any(t => validCodes.Contains(t.trackingCode, StringComparer.OrdinalIgnoreCase)))
.Where(st => !st.trackings.Any(t => invalidCodes.Contains(t.trackingCode, StringComparer.OrdinalIgnoreCase)))
.ToList();
而不是兩個Where,你也可以使用一個帶&&。我更喜歡兩個,因為它更容易閱讀。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/367379.html
上一篇:Linq到具有未知列的資料表
下一篇:獲取串列中的最后一個重復元素
