簡體   English   中英

通過 C# 中的 LINQ 查詢過濾相同元素的兩個列表

[英]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.

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