感谢 Jon Skeet,这对我很有帮助。它工作得很好,所有的单元测试都成功通过了。
在这里,我想与任何想在 .NET 2.0 中使用域名解析器的人分享答案
1 更改此代码 (DomainName.cs)
// Try to match an exception rule:
var exceptionresults = from test in TLDRulesCache.Instance.TLDRuleList
where
test.Name.Equals(checkAgainst, StringComparison.InvariantCultureIgnoreCase)
&&
test.Type == TLDRule.RuleType.Exception
select
test;
// Try to match an wildcard rule:
var wildcardresults = from test in TLDRulesCache.Instance.TLDRuleList
where
test.Name.Equals(checkAgainst, StringComparison.InvariantCultureIgnoreCase)
&&
test.Type == TLDRule.RuleType.Wildcard
select
test;
// Try to match a normal rule:
var normalresults = from test in TLDRulesCache.Instance.TLDRuleList
where
test.Name.Equals(checkAgainst, StringComparison.InvariantCultureIgnoreCase)
&&
test.Type == TLDRule.RuleType.Normal
select
test;
进入这个:
List<TLDRule> exceptionresults = MatchRule(TLDRulesCache.Instance.TLDRuleList, checkAgainst, TLDRule.RuleType.Exception);
List<TLDRule> wildcardresults = MatchRule(TLDRulesCache.Instance.TLDRuleList, checkAgainst, TLDRule.RuleType.Wildcard);
List<TLDRule> normalresults = MatchRule(TLDRulesCache.Instance.TLDRuleList, checkAgainst, TLDRule.RuleType.Normal);
private static List<TLDRule> MatchRule(List<TLDRule> rules, string checkAgainst, TLDRule.RuleType ruleType)
{
List<TLDRule> matchedResult = new List<TLDRule>();
foreach (TLDRule rule in rules)
{
if (rule.Name.Equals(checkAgainst, StringComparison.InvariantCultureIgnoreCase)
&& rule.Type == ruleType)
{
matchedResult.Add(rule);
}
}
return matchedResult;
}
2 改变这个:
// Sort our matches list (longest rule wins, according to :
var results = from match in ruleMatches
orderby match.Name.Length descending
select match;
// Take the top result (our primary match):
TLDRule primaryMatch = results.Take(1).SingleOrDefault();
进入这个
TLDRule primaryMatch = null;
if (ruleMatches.Count > 0)
{
// match2 CompareTo match1 (reverse order) to make the descending
ruleMatches.Sort(delegate(TLDRule match1, TLDRule match2) { return match2.Name.Length.CompareTo(match1.Name.Length); });
primaryMatch = ruleMatches[0];
}
3 改变这个(TLDRulesCache.cs)
IEnumerable<TLDRule> lstTLDRules = from ruleString in lstTLDRuleStrings
where
!ruleString.StartsWith("//", StringComparison.InvariantCultureIgnoreCase)
&&
!(ruleString.Trim().Length == 0)
select new TLDRule(ruleString);
进入这个
List<TLDRule> lstTLDRules = ListTLDRule(lstTLDRuleStrings);
private static List<TLDRule> ListTLDRule(List<string> lstTLDRuleStrings)
{
List<TLDRule> lstTLDRule = new List<TLDRule>();
foreach (string ruleString in lstTLDRuleStrings)
{
if (!ruleString.StartsWith("//", StringComparison.InvariantCultureIgnoreCase)
&&
!(ruleString.Trim().Length == 0))
{
lstTLDRule.Add(new TLDRule(ruleString));
}
}
return lstTLDRule;
}
其他一些是小东西,例如:
List<string> lstDomainParts = domainString.Split('.').ToList<string>();
改成:
List<string> lstDomainParts = new List<string>(domainString.Split('.'));
并删除 .ToList() 像
“var exceptionresults”将使用 exceptionresults.ToList() 来获取列表。由于“var exceptionresults”更改为“List exceptionresults”.ToList() 应该被删除。
呼叫MeLaNN