如何实现IComparable以对数字和非数字字符串进行排序。
首先,我想在“列表”中获取最小值和最大值。
它要求我实施ICompareable。 “至少有一个对象必须实现IComparable”
任何人都可以帮助我吗?这是我的代码:
// 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>
答案 0 :(得分:1)
您正在尝试获取Min()和Max()元素为了能够在其上调用Min(),XElement应该实现IComparable。因为它没有,你不能直接调用元素集合上的Min。
为什么不尝试按值对元素进行排序并采用第一个和最后一个?
var ordered = elements.OrderBy(e => e.Value).ToList();
var min = ordered.First().Value;
var max = ordered.Last().Value;
答案 1 :(得分:0)
这是因为您要求最小和最大XElement
对象,并且框架不知道如何比较XElement
,因为它没有实现IComparable
。 var elements
的确评估为IEnumerable<XElement> elements
。
另请注意,您的代码效率不高,因为您首先排序然后再循环两次列表,一次为Min,一次为Max。
Yann的解决方案既更有效又可行:
var ordered = elements.OrderBy(e => e.Value).ToList();
var min = ordered.First().Value;
var max = ordered.Last().Value;