2010-01-08 2 views
0

У меня есть существующий бит кода для сортировки списка объектов.Преобразование родовой коллекции сортировки для использования Linq

productsList.Sort(
    delegate(Product p1, Product p2) 
    { 
     int result = p1.StartDatetime.CompareTo(p2.StartDatetime); 
     if (result == 0) 
     { 
      if (p1.SomeId == p2.SomeId) 
      { 
       result = 0; 
      } 
      else if (p1.SomeId == null) 
      { 
       result = -1; 
      } 
      else if (p2.SomeId == null) 
      { 
       result = 1; 
      } 
     } 
     return result; 
    }); 

У меня есть ощущение, что это может быть упрощена, заменив его:

productsList = productsList 
     .OrderBy(p => p.StartDatetime) 
     .ThenBy(p => p.SomeId) 
     .ToList(); 

Я правильно в моем предположении?

ответ

2

Не совсем, но это близко. Первый может заказать

List<Product> productsList = new List<Product>() { 
    new Product { StartDatetime = new DateTime(2010, 1, 1), SomeId = 2 }, 
    new Product { StartDatetime = new DateTime(2010, 1, 1), SomeId = 4 } 
}; 

в обратном порядке (с SomeId равен 4 первым и SomeId равен 2 вторым), а второй будет заказать их в качестве Product с SomeId равно 2 первыми и Product с SomeId равен 4 вторыми. Это связано с тем, что делегат, как он определен в настоящее время, не обрабатывает случай, когда два SomeId s являются непустыми и разными. Итак, что касается соответствующего делегата, то указанные выше два Product s являются «равными», но в соответствии с запросом LINQ они не являются.

Смежные вопросы