【问题标题】:How to get a list of matched ID's using Linq?如何使用 Linq 获取匹配 ID 的列表?
【发布时间】:2012-04-16 20:17:58
【问题描述】:

我正在维护一个使用 _clientList.Add(clientIDGuid, newsfeedClient); 登录的客户字典

NewsfeedClient 类:

public class NewsfeedClient
{
    /// <summary>
    /// Represents Newsfeed's own clientID
    /// </summary>
    public string ClientIDGuid { get; set; }  // also adding the dictionary's ID

    /// <summary>
    /// Represents the logged in client's session ID
    /// </summary>
    public string SessionID { get; set; }
    public string Nickname { get; set; }
    public int ProfileID { get; set; }

    public GeoLocation Location { get; set; }

    public List<MyDB.Models.Buddy> BuddyList { get; set; }

    [ScriptIgnore]
    public DateTime LastResponseTime { get; set; }

    public class GeoLocation
    {
        public float Latitude { get; set; }
        public float Longitude { get; set; }
    }
}

Buddy 对象包含一个 ProfileID 属性。

我想获取所有字典 clientID 的列表,其中匹配的 profileID 在该新客户端的 BuddyList 中。

我猜测 Intersect 方法会发挥作用,如 here 所示,但我不太确定如何在不创建至少一个 foreach 循环的情况下将其组合在一起。

-- 更新--

clientID 不是 == ProfileID 这些值是不同的。

【问题讨论】:

  • 所以,澄清一下 - 您想查找单个 NewsFeedClient 的 BuddyList 中包含的所有 ProfileId 的所有 NewsFeedClient 对象吗?

标签: c# linq collections asp.net-4.0


【解决方案1】:

假设我已正确阅读您的问题,试试这个:

var matches = _clientList
            .Where(c => c.Value.BuddyList.Any(b => b.ProfileID == c.Value.ProfileID))
            .Select(c => c.Key)
            .ToList();

【讨论】:

  • 您似乎正在尝试将 profileID 与字典键匹配。字典键只是一个 GUID,不会匹配任何配置文件 ID (int)。所以我想要包含一个 profileID 的字典键 == b.ProfileID 中的任何一个。
  • 啊抱歉,所以你想在 newsFeedClient 中的 profileId 上匹配 BuddyList Profile Id,这是字典的 Value 项?
  • 对。我以为我可以遍历字典值列表,但宁愿不必开始创建循环。所以我想要字典键,其中值包含 newsfeedClient.BuddyList 列表中的 profileID。
  • 检查我的编辑,这将为您提供字典的键,其中值中的 BuddyList 包含该值的配置文件 ID,对吗?
  • 啊,是的,看起来更好。解释起来有点笨拙。谢谢。
【解决方案2】:

假设我的问题是正确的,应该是这样的:

var matches = _clientList.ToList()
    .Select(x => x.Key)
    .Intersect(currentNewsFeed.BuddyList.Select(x => x.ProfileId))
    .ToList();

【讨论】:

  • 您的 LINQ 查询中似乎至少有一个 ToList 太多 (_clientList.ToList())
  • 是的,做 _clientList.ToList() 会破坏不是吗?因为 _clientList 目前是一本字典 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多