我得到像这样的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包含节点及其值作为键值对。现在,我想根据用户输入对此进行排序。例如如果用户想要按日期或类型名称排序。怎么做?在数据表中排序或直接在列表中排序都可以。
我试图在数据表中排序,但所有时间结果都保持不变。请提供相同的建议。
答案 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();