Как реализовать IComparable для сортировки числовых и нечисловых строк - PullRequest
0 голосов
/ 04 декабря 2009

Как реализовать IComparable для сортировки числовых и нечисловых строк.

Во-первых, я хочу получить значения Min и Max в «списке».

Он просит меня реализовать 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>

Ответы [ 2 ]

1 голос
/ 04 декабря 2009

Вы пытаетесь получить элементы Min () и Max () Чтобы иметь возможность вызывать Min () для него, XElement должен реализовать IComparable. Поскольку это не так, вы не можете напрямую вызвать Min для коллекции Element.

Почему бы вам не попробовать отсортировать ваши элементы по значению и взять первое и последнее?

var ordered = elements.OrderBy(e => e.Value).ToList();
var min = ordered.First().Value;
var max = ordered.Last().Value;
0 голосов
/ 04 декабря 2009

Это потому, что вы запрашиваете минимальный и максимальный XElement объект, а среда не знает, как сравнивать XElement s, поскольку она не реализует IComparable. var elements действительно оценивается как IEnumerable<XElement> elements.

Также обратите внимание, что ваш код не очень эффективен, так как вы сначала сортируете, а затем циклически просматриваете список еще два раза, один раз для минимальной и один раз для максимальной.

Решение Янна более эффективно и будет работать:

var ordered = elements.OrderBy(e => e.Value).ToList();      
var min = ordered.First().Value;      
var max = ordered.Last().Value;  
...