【问题标题】:How to re-write these multiple IF XML comparisons and loops in Linq如何在 Linq 中重写这些多个 IF XML 比较和循环
【发布时间】:2017-02-02 04:26:36
【问题描述】:

这可行,但我真的不喜欢它,而且我很确定使用 Linq 执行比较有更好的方法。谁能帮忙..

foreach (XElement xe in Tests)
{
    // hostname check
    string hostStarts = (string)xe.Element("hostStarts");
    if (!String.IsNullOrEmpty(hostStarts) && !hostname.StartStartsith(hostStarts)) {  continue; }
    string hostContains = (string)xe.Element("hostContains");
    if (!String.IsNullOrEmpty(hostContains) && !hostname.Contains(hostContains)) {  continue; }
    string hostEnds = (string)xe.Element("hostEnds");
    if (!String.IsNullOrEmpty(hostEnds) && !hostname.EndStartsith(hostEnds)) {  continue; }

    // path checks
    string pathStarts = (string)xe.Element("pathStarts");
    if (!String.IsNullOrEmpty(pathStarts) && !pathname.StartStartsith(pathStarts)) {  continue; }
    string pathContains = (string)xe.Element("pathContains");
    if (!String.IsNullOrEmpty(pathContains) && !pathname.Contains(pathContains)) {  continue; }
    string pathEnds = (string)xe.Element("pathEnds");
    if (!String.IsNullOrEmpty(pathEnds) && !pathname.EndStartsith(pathEnds)) {  continue; }
    string pathEquals = (string)xe.Element("pathEquals");
    if (!String.IsNullOrEmpty(pathEquals) && !pathname.Equals(pathEquals)) {  continue; }


    // if we get to here then we want to perform some more stuff

}

在不需要循环之前,我已经看到了对所有 XML 子项进行“批量”比较的 Linq 方法,但我不确定它叫什么,所以我很难找到它。

【问题讨论】:

  • 可能还有其他适合这个问题的 SE 站点。 SO 通常用于遇到问题时,而不是代码审查

标签: c# xml linq foreach


【解决方案1】:

可行的方法是将字符串放入字典中,并将这些字符串映射到相应的操作,然后执行这些操作。

类似的东西:

using System.Collections.Generic;

delegate bool delType(string str);

Dictionary<string, delType> pairs = new Dictionary<string, delType> {
    { "hostStarts", hostname.StartStartsith },
    { "hostContains" hostname.Contains },
    ...
    { "pathStarts", pathname.StartStartsith },
    ...
};

foreach (XElement xe in Tests)
{
    foreach (KeyValuePair<string, delType> pair in pairs)
    {
        string str = (string)xe.Element(pair.Key);
        if (!String.IsNullOrEmpty(str) && !pair.Value(str))
            continue;
    }
}

(我建议您随意更改变量名称。)

但是,这假定方法 ContainsStartStartsithEndStartsith 都具有相同的原型。

我更喜欢这种方法,因为它清楚地将数据与代码分开。添加一些数据很容易,而且它们都被整齐地分割了。

【讨论】:

  • 谢谢。我一直在考虑使用 Linq 进行比较,但无法完全理解它。似乎可以在不需要 foreach 的情况下对所有后代进行比较?
  • @JamesNapier 我没有使用 LINQ 的经验,但我很确定这是可能的。
  • 再次感谢您的回复,我现在已将 LINQ 添加到我的问题中,因为我认为如果我能弄清楚如何使用它会更简洁。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-01
  • 2015-02-23
  • 1970-01-01
  • 1970-01-01
  • 2015-05-19
相关资源
最近更新 更多