基于xml列节点值对数据表进行排序

时间:2017-11-27 09:37:29

标签: c# xml list sorting datatable

我得到像这样的DataTable

ID  Name   Type   XML
1   Test   Pro    <sample><Name>xyz</Name><Type>xyz</Type><Date>2015-01-01</Date></sample>
2   Test2  Pro2   <sample><Name>abc</Name><Type>pqr</Type><Date>2015-01-02</Date></sample>

我将其转换为类,如下所示

Public class test
{
       public int ID{get;set;)
       public int Name{get;set;)
       public int Type{get;set;)
       public dictionary<string,string> XML{get;set;)
}

此XML包含节点及其值作为键值对。现在,我想根据用户输入对此进行排序。例如如果用户想要按日期或类型名称排序。怎么做?在数据表中排序或直接在列表中排序都可以。

我试图在数据表中排序,但所有时间结果都保持不变。请提供相同的建议。

1 个答案:

答案 0 :(得分:0)

您可以使用为您的类型实现IComparer的类的实例。比较器实现然后知道要应用哪些规则,例如当您的类型具有词典时。

这是一个让您入门的示例实现。请注意,我没有费心实现具有空值的所有不同边缘情况。这留给读者练习。

public class Test
{
    public int ID{get;set;}
    public int Name{get;set;}
    public int Type{get;set;}
    public Dictionary<string,string> XML{get;set;}

    // this class handles comparing a type that has a dictionary of strings
    private class Comparer: IComparer<Test>
    {
        string _key;
        // key is the keyvalue from the dictionary we want to compare against
        public Comparer(string key) 
        {
            _key=key;
        }

        public int Compare(Test left, Test right) 
        {
            // let's ignore the null cases,
            if (left == null && right == null)  return 0;
            string leftValue;
            string rightValue;
            // if both Dictionaries have the key we want to sort on ...
            if (left.XML.TryGetValue(_key, out leftValue) && 
                right.XML.TryGetValue(_key, out rightValue)) 
            {
                // ... lets compare on those values
                return leftValue.CompareTo(rightValue);     
            }
            return 0;
        }
    }

    // this method gives you an Instace that implements an IComparer
    // that knows how to handle your type with its dictionary
    public static  IComparer<Test> SortOn(string key)
    {
        return new Comparer(key);
    }
}

在任何采用IComparer的Sort方法中使用上述类,例如,在可以执行的普通列表中:

list.Sort(Test.SortOn("Date"));

这将对列表进行排序。

要测试上述代码,您可以使用此测试装备:

var list = new List<Test> { 
    new Test {ID=1, Name =2, Type=3, 
        XML = new Dictionary<string,string>{{"Date","2017-09-01"}}},
    new Test {ID=10, Name =20, Type=30, 
        XML = new Dictionary<string,string>{{"Date","2017-01-01"}}},
    new Test {ID=100, Name =200, Type=300, 
        XML = new Dictionary<string,string>{{"Date","2017-03-01"}}},
        };

list.Sort(Test.SortOn("Date"));

list.Dump();