использование Компаратора к виду IEnumerable в C# различными полями

У меня есть список объекта, который должен быть отсортирован в зависимости от трех различных свойств объекта. Пример

CLass Object1{ Property1 , Property2, Property3}

ListObj = IEnumerable<Object1>

Foreach ( item in ListObj){

    if (item.Property1 == true)
       item goes at top of list
    if(item.Property2 == true)
       item goes end of list
    if(item.Property3 == true)
        item can go anywhere.
}

Список конца должен быть объектами с Property1 = верный сопровождаемый объектами с Property2 = верный сопровождаемый объектами с Property3 = верный

8
задан Ahmad Mageed 26 February 2010 в 22:35
поделиться

5 ответов

Почему бы не использовать LINQ?

var orderedList = 
   ListObj.OrderByDescending(x => x.Property1)
          .ThenByDescending(x => x.Property2);
8
ответ дан 5 December 2019 в 10:02
поделиться

В вашем собственном заголовке уже сказано все: реализуйте собственный IComparer и передайте его OrderBy метод расширения:

var orderedItems = ListObj.OrderBy(obj => obj, customComparer);
5
ответ дан 5 December 2019 в 10:02
поделиться

Вы можете сделать вещи более аккуратными, если определите этот тип:

  public class ComparisonComparer<T> : IComparer<T>  
  {  
      private readonly Comparison<T> _comparison;  

      public ComparisonComparer(Comparison<T> comparison)  
      {  
          _comparison = comparison;  
      }  

      public int Compare(T x, T y)  
      {  
          return _comparison(x, y);  
      }  
 }  

Который позволяет вам определять сравнение в строке с оператором LINQ, используя лямбда-выражение.

2
ответ дан 5 December 2019 в 10:02
поделиться

Я думаю, вы хотите определить функцию сравнения, в которой вы можете определять ранг между любыми двумя элементами в список.

    int CompareObject1(Object1 left, Object1 right)
    {
        // TODO: cases where your items are null

        // compare Property1 values
        if (left.Property1)
        {
            if (right.Property1)
            {
                // items at same rank
                return 0;
            }
            else
            {
                // left item is higher rank than right
                return -1;
            }
        }
        else if (right.Property1)
        {
            // right item is higher rank than left
            return 1;
        }

        // Property1 doesn't indicate position, move along
        // TODO: repeat for Property2

        // Property2 doesn't indicate position, move along
        // TODO: repeat for Property3

        // if we get here, no determination can 
        // be made/don't bother to move anything
        return 0;
    }

возвращаемое значение указывает, должен ли левый или правый объект быть ранжирован выше: -1 или 1 (или 0 для предпочтения). просто убедитесь, что вы покрываете все свои условия.

, то вы можете использовать это как

List<Object1> foo = new List<Object1>() { <items...> };
foo.Sort(CompareObject1);

, если список заканчивается в обратном направлении, я, вероятно, перевернул знаки в функции сравнения. ваши правила сортировки противоречивы, поэтому я позволю вам отсортировать Property2 и Property3.

1
ответ дан 5 December 2019 в 10:02
поделиться

Это должно обеспечить требуемую сортировку (в соответствии с кодом, а не приведенным ниже утверждением).

ListObj.Where(x => x.Property1 == true)
       .Concat(ListObj.Where(x => x.Property1 == false && x.Property2 == false))
       .Concat(ListObj.Where(x => x.Property2 == true));
1
ответ дан 5 December 2019 в 10:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: