我有一个名为“Company.Product.Sub1.Sub2.IService”的命名空间字符串。 Sub1 / Sub2的计数可能不同,但通常它们是匹配的一部分 一个字典,其中AssemblyFullname为键,其路径为值。
现在我写了这段代码
string fullName = interfaceCodeElement.FullName;
var fullNameParts = interfaceCodeElement.FullName.Split('.').Reverse();
KeyValuePair<string, string> type = new KeyValuePair<string,string>();
foreach (var item in fullNameParts)
{
var match = references.Where(x => x.Key.Contains(item)).ToList();
if (match.Count > 0)
{
type = match[0];
break;
}
}
有效,但在我看来并不好看。
我用linq尝试过,但我不知道如何写它。
var matches = from reference in refs
where reference.Key.Contains(fullNameParts.Reverse().
感谢您的帮助。
答案 0 :(得分:0)
这应该会给你一个匹配列表:
var listOfMatches = fullNameParts.Where(fp => references.Where(r => r.Key.Contains(fp))).ToList();
编辑:根据您的评论,我认为我有点理解。假设你在某处有一些fullName
的列表:
// Making this up because I am nor sure what you have to start with
List<string> yourListOfAllYourFullNames = GetThisList();
var listOfMatches = yourListOfAllYourFullNames.Where(
fnl => fnl.Split('.').Reverse().Where(
fnp => references.Where(r => r.Key.Contains(fnp))).Count() > 0).ToList();
答案 1 :(得分:0)
首先把它放到英语中,你试图遍历interfaceCodeElement中Fullname的部分(向后),并找到第一个匹配(作为子字符串,区分大小写)引用中的任何键的键(是从全名到路径的Dictionary<string, string>
。您的结果type
是KeyValuePair<string, string>
,但不清楚您是否确实需要(键和值)或只需要其中一个。
一,在这种情况下有一个字典似乎有点奇怪,因为你无法查找为一个键,但我想它仍然可以用于此目的:)切换到{{1}之类的东西}或List<Tuple<string, string>>
可能有意义,因为迭代引用的对的顺序可能会影响选择哪一对类型。
为了让您更容易理解,我会在此处添加List<KeyValuePair<string, string>>
:
let