-3

我们如何将字符串内容传递给下面的“比较器”函数?

public static void Sort(XmlNodeList nodes, Comparison<XmlElement> comparer)
{
    // The nodes.Count == 0 will break the nodes[0].ParentNode,
    // the nodes.Count == 1 is pure optimization :-)
    if (nodes.Count < 2)
    {
        return;
    }
    var parent = nodes[0].ParentNode;
    var list = new List<XmlElement>(nodes.Count);
    foreach (XmlElement element in nodes)
    {
        list.Add(element);
    }
    list.Sort(Comparer);
    foreach (XmlElement element in list)
    {
        // You can't remove in the other foreach, because it will break 
        // the childNodes collection
        parent.RemoveChild(element);
        parent.AppendChild(element);
    }
}

public static int Comparer(XmlElement a, XmlElement b,str strAttributeName)
{
    int aaa = int.Parse(a.Attributes["aa"].Value);
    int aab = int.Parse(b.Attributes["aa"].Value);
    int cmp = aaa.CompareTo(aab);
    if (cmp != 0)
    {
        return cmp;
    }
    int ba = int.Parse(a.Attributes["b"].Value);
    int bb = int.Parse(b.Attributes["b"].Value);
    cmp = ba.CompareTo(bb);
    return cmp;
}

在这里,我想像上面的代码a.Attributes["aa"].Value一样a.Attributes[strAttributeName].Value使其更通用。我们该怎么做呢?

请帮忙。

4

3 回答 3

1

您试图Comparer通过添加 XML 属性名称作为参数来使您的函数更通用。但是,这样做会更改函数的签名,因此它不再与List.Sort(Comparison<T> comparison).

幸运的是,您可以替换list.Sort(Comparer)为 lambda,它允许您将其他参数传递给函数Comparer"aa"作为属性名称传递:

list.Sort((a, b) => Comparer(a, b, "aa"));

"b"作为属性名称传递:

list.Sort((a, b) => Comparer(a, b, "b"));
于 2013-08-27T14:04:56.917 回答
0
public static int Comparer(XmlElement a, XmlElwment b, string strAttributeName)
于 2013-08-27T14:01:34.977 回答
0

您应该能够执行以下操作:

string strAttributeName = "aa"; //Or dynamically set the value
list.Sort((a, b) => Comparer(a, b, strAttributeName));

此外,您需要将您的 Copare 方法更正为

public static int Comparer(System.Xml.XmlElement a, System.Xml.XmlElement b,
    string strAttributeName)

因为“str”在 C# 中无效。

于 2013-08-27T14:16:20.520 回答