C # сортировать словарь с помощью linq

#c# #linq

#c# #linq

Вопрос:

У меня есть словарь на C#:

 public Dictionary<Product, int>
  

И я хотел бы получить свой результат в виде общего списка:

 List<Product> productList = new List<Product>();
  

При этом порядок товаров уменьшается на значение int в словаре. Я пытался использовать метод orderby, но безуспешно.

Комментарии:

1. Когда вы говорите «безуспешно», вы получаете исключение во время выполнения? Или результат отсортирован не так, как вы ожидаете? Какой код упорядочивания вы в настоящее время пытаетесь выполнить, на случай, если предоставленные ответы уже соответствуют тому, что вы сделали.

2. Я использовал orderby () для значений, но не знал, что смогу извлекать значения ключей с помощью select (). Итак, проблема решена 🙂

3. Возможно, вам следует рассмотреть возможность использования SortedDictionary

Ответ №1:

Вы можете сделать это с помощью:

 List<Product> productList = dictionary.OrderByDescending(kp => kp.Value)
                                      .Select(kp => kp.Key)
                                      .ToList();
  

Комментарии:

1. Спасибо всем вам. Следующий вопрос: использую ли я Take-метод для получения x количества результатов? Если я хочу ограничить

2. Да, вы можете использовать . Возьмите (x), чтобы получить x результатов. (И Skip(), если вы пытаетесь выполнить подкачку. Помните, порядок этих операторов имеет значение).

3. Да, вы можете использовать Take(int n), чтобы ограничить выбор

4. @Johan. Да, Take(6) вернет первые шесть результатов. Вы также можете использовать Skip() . Например, Skip(6).Take(4) пропустит первые 6 результатов и вернет следующие 4.

Ответ №2:

Попробуйте это

 List<Product> productList = dictionary.OrderByDescending(x => x.Value).Select(x => x.Key).ToList();
  

Ответ №3:

 MyDict.OrderByDescending(x => x.Value).Select(p => p.Key).ToList();
  

Ответ №4:

Вот пример использования синтаксиса запроса LINQ.

  public class TestDictionary 
    {
        public void Test()
        {
            Dictionary<Product, int> dict=new Dictionary<Product, int>();
            dict.Add(new Product(){Data = 1}, 1);
            dict.Add(new Product() { Data = 2 }, 2);
            dict.Add(new Product() { Data = 3 }, 3);
            dict.Add(new Product() { Data = 4 }, 9);
            dict.Add(new Product() { Data = 5 }, 5);
            dict.Add(new Product() { Data = 6 }, 6);

            var query=(from c in dict 
                orderby c.Value descending 
                select c.Key).ToList();       
        }
        [DebuggerDisplay("{Data}")]
        public class Product
        {
            public int Data { get; set; }
        }           
    }
  

Комментарии:

1. «чистый Linq» — это очень спорное утверждение, потому что ваш запрос будет скомпилирован в цепочку методов выше. Еще более «чистым» было бы написать цепочки методов IEnumerable с делегатами.