C#:将字符串传递给下面的函数

本文关键字:函数 字符串 | 更新日期: 2023-09-27 18:29:07

我们如何将字符串内容传递给下面的"comparer"函数?

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,使其更通用。我们该怎么做?

请帮忙。

C#:将字符串传递给下面的函数

您正试图通过添加XML属性名称作为参数来提高Comparer函数的通用性。但是,这样做会更改函数的签名,使其不再与List.Sort(Comparison<T> comparison)所需的委托的签名匹配。

幸运的是,您可以用lambda替换list.Sort(Comparer),这样您就可以向函数Comparer传递额外的参数。传递"aa"作为属性名称:

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

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

list.Sort((a, b) => Comparer(a, b, "b"));
public static int Comparer(XmlElement a, XmlElwment b, string strAttributeName)

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

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#中无效。