从两个linq列表投影到新班级

时间:2018-11-11 09:55:12

标签: asp.net linq

我有一个配对的现有课程,看起来像这样:

public class SiloNode
{
    public string Key { get; set; }
    public List<string> RelatedTopics { get; set; }
    public string Url { get; set; }
}

是唯一的键,而 RelatedTopics 包含相关的键列表。

我维护了这些节点的列表:

List<SiloNode> MasterList = new List<SiloNode>();

我使用查询提取所有相关主题,然后稍后创建一些链接:

public static IEnumerable<SiloNode> RelatedNodes(this SiloNode root)
{
    return MasterList.Where(x => root.RelatedTopics.Contains(x.Key));
}

以上所有方法。

但是,我需要更改 RelatedTopics ,以便可以添加一些关系唯一的锚文本。

因此,首先,我又创建了两个类:

public class RelatedNode
{
    public string AnchorText { get; set; }
    public string Key { get; set; }
}

public class NodeLink
{
    public NodeLink(string url, string text)
    {
        Url = url;
        Text = text;
    }

    public string Text { get; set; }
    public string Url { get; set; }
}

然后我对SiloNode类进行更改:

public class SiloNode
{
    public string Key { get; set; }
    public List<RelatedNode> RelatedTopics { get; set; }
    public string Url { get; set; }
}

因此,现在, RelatedTopics 不再仅包含一个简单的键,它还包含一些我想应用于该关系的锚文本。

这是我苦苦挣扎的地方-下面的代码不完整

public static IEnumerable<NodeLink> RelatedNodes(this SiloNode root)
{
    return MasterList.Where(x => root.RelatedTopics.Contains(x.Key))
        .Select(y => new NodeLink(y.Url, "HOW DO I GET ANCHOR TEXT?"));
}

我需要将两侧链接在一起,以便可以访问y.Url和root.RelatedTopics.Text。

我仍然需要匹配相关节点,然后投影到新的NodeLink。当密钥在“ x”中可用时,锚文本在root.RelatedTopics中。我认为当前的linq结构不足以解决此查询,但我不是专家。

任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

Contains替换为Any,然后添加一个内部Select

masterList
 .Where(m => m.RelatedTopics.Any(t => m.Key == t.Key))
 .Select(m => m.RelatedTopics.Where(m.Key == t.Key)
                             .Select(t => new NodeLink(m.Url, t.AnchorText)));

或者,执行以下操作:

masterList
 .Select(m => m.RelatedTopics
                 .Where(t => m.Key == t.Key)
                 .Select(t => new NodeLink(m.Url, t.AnchorText)));