我有一个配对的现有课程,看起来像这样:
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结构不足以解决此查询,但我不是专家。
任何帮助表示赞赏。
答案 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)));