Linq to xml 如何实现IComparable对数字和非数字字符串进行排序
如何实现IComparable对数字和非数字字符串进行排序 首先,我想得到“列表”中的最小值和最大值。 它要求我实现iComparable。“至少一个对象必须实现IComparable” 有人能帮我吗?这是我的密码:Linq to xml 如何实现IComparable对数字和非数字字符串进行排序,linq-to-xml,icomparable,Linq To Xml,Icomparable,如何实现IComparable对数字和非数字字符串进行排序 首先,我想得到“列表”中的最小值和最大值。 它要求我实现iComparable。“至少一个对象必须实现IComparable” 有人能帮我吗?这是我的密码: // setup string filePath1 = Directory.GetCurrentDirectory().ToLower().Replace(@"\bin\debug", string.Empty) + @"\S
// setup
string filePath1 = Directory.GetCurrentDirectory().ToLower().Replace(@"\bin\debug", string.Empty)
+ @"\SampleData\products.xml";
// load XML
var xdoc1 = XElement.Load(filePath1);
//list
var elements = xdoc1.Descendants("ProductName").OrderBy(x => x.Value);
//output
Console.WriteLine("Min- " + elements.Min().Value);
Console.WriteLine("Max- " + elements.Max().Value);
这是我的XML文件:
<Products>
<ProductName>9954</ProductName>
<ProductName>987</ProductName>
<ProductName>197</ProductName>
<ProductName>56</ProductName>
<ProductName>rr45</ProductName>
<ProductName>ad4</ProductName>
<ProductName>7</ProductName>
<ProductName>69dd</ProductName>
<ProductName>69</ProductName>
<ProductName>197abc</ProductName>
</Products>
9954
987
197
56
rr45
ad4
7.
69日
69
197abc
您试图获取Min()和Max()元素以便能够对其调用Min(),XElement应该实现IComparable。因为它不是,所以不能直接在元素集合上调用Min
为什么不尝试按值对元素进行排序,并取第一个和最后一个
var ordered = elements.OrderBy(e => e.Value).ToList();
var min = ordered.First().Value;
var max = ordered.Last().Value;
这是因为您要求最小和最大
XElement
对象,而框架不知道如何比较XElement
s,因为它没有实现IComparable
<代码>变量元素的计算结果实际上是IEnumerable元素
还要注意的是,您的代码不是很有效,因为您首先排序,然后在列表中循环两次,一次用于Min,一次用于Max
Yann的解决方案不仅效率更高,而且会起作用:
var ordered = elements.OrderBy(e => e.Value).ToList();
var min = ordered.First().Value;
var max = ordered.Last().Value;
感谢您的帮助,但我想知道如何使用elements.OrderBy(e=>e.Value).Min()完成此操作。你知道如何实现IComparable接口吗。谢谢Yann。你不能,因为元素没有实现IComparable,而Min需要IComparable。或者你可以执行elements.OrderBy(e=>e.Value)。Select(e=>e.Value)。Min()但是你不会得到元素,只有值。对不起,elements.Select(e=>e.Value)。Min()更好。