[英]Filter of two lists for the same elements via LINQ query in C#
我有一個要聽的活動。 當設備設置發生變化時觸發此事件。 然后,此事件為我提供了所有可用設備的列表。
現在我有所謂的站,每個站都鏈接到一個設備。 我發送一個返回所有這些電台的查詢。
這兩個字段都擁有一個DeviceUid
屬性。 現在我想為每個設備執行某個 function,在站內也可以找到(見代碼片段):
事件:
public class DeviceEvent
{
public virtual List<DeviceInfo> Device { get; set; }
}
我的方法:
public void SomeMethod(DeviceEvent evt)
{
var stations = Do.Query(new GetStationQuery(){ SomeInput })
.Where(x => x.DeviceIsRegistered)
.ToList();
// type: List<DeviceInfo>
var deviceInfoList = evt.Device;
// TODO: get DeviceInfo for each Device which can be found in stations.
foreach (var VARIABLE in COLLECTION)
{
DoSomething(station, deviceInfo);
}
}
private void DoSomething(StationInfo stationInfo,
DeviceInfo deviceInfo)
{
// some code
}
我的做法:
將stations
中相應的DeviceUid
存儲為單獨的列表 ( var stationDeviceUidList
)。 然后我檢查是否可以在stationDeviceUidList
中找到來自deviceInfoList
的元素( Uid
)。
然后我用找到的Uids
獲取所有DeviceInfo
,並將它們作為參數提供給DoSomething()
方法。
var stationDeviceUidList = stations.Select(x => x.DeviceId);
var deviceUidList = deviceInfoList.Select(x => x.DeviceUid)
.ToList();
// How do I get a corresponding Uid here?
var test = deviceUidList.Where(x => deviceUidList.Contains(stationDeviceUidList));
我無法正確完成最后一步,並且對 id 匹配的查詢肯定是錯誤的。
我的方法是否有意義? 我希望你能幫助我並解釋我的錯誤。
假設您的站 class 看起來像
class Station{
DeviceInfo Device = ...
int DeviceId = ... //or guid, doesn't matter
}
你的 DeviceInfo 看起來像:
class DeviceInfo{
int DeviceUid = ... //or guid, doesn't matter, this is equal to station.DeviceId
}
並且您的 DeviceInfo 事件列表稱為 Devices (類列表應該是復數)
你可以:
context.Stations.Where(s => Devices.Any(d => d.DeviceUid == s.DeviceId))
這意味着“對於所有工作站,僅給出(事件設備列表中的設備等於工作站的設備 ID 的任何項目)的工作站” - 即“僅給出 ID 在事件設備列表中的設備的那些工作站”身份證"
您似乎有一些方法可以生成一個電台列表,我在里面看不到,但我不建議您首先(在任何階段)使用 ToList() 處理您的電台,因為這意味着您的客戶端會下載每個電台。 如果您將其保留為可查詢,則無需下載每個電台即可形成查詢,因此只有您想要的電台才會下載
哦,您可以將其他條件疊加到您的位置中:
context.Stations.Where(s => s.IsRegistered && Devices.Any(d => d.DeviceUid == s.DeviceId))
這個功能應該可以解決問題。 由於兩個答案的方法,我能夠調整相應的 LINQ 命令。
在上面的查詢中,查詢注冊設備的站點就足夠了,因為每個站點只包含一個設備。
在foreach
循環中,我還可以使用Single()
並將此信息傳遞給新方法。
public void SomeMethod(DeviceEvent evt)
{
var stationsInfo = var stations = Do.Query(new GetStationQuery(){ SomeInput });
var stationsForDevice = stationsInfo.Where(info => info.DeviceIsRegistered);
foreach (var stationInfo in stationsForDevice)
{
var deviceInfo = evt.Device.Single(info => info.DeviceUid.Equals(stationInfo.DeviceId));
DoSomething(stationInfo, deviceInfo );
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.