Как в C# с помощью LINQ сделать выборку классов с одинаковым значением в поле?

Например, есть JSON

var products = JArray.Parse(@"[{
    id: 1,
    name: 'Product 1',
    variantId: 1
}, {
    id: 2,
    name: 'Product 2',
    variantId: 1
}, {
    id: 3,
    name: 'Product 3',
    variantId: 1
}, {
    id: 4,
    name: 'Product 4',
    variantId: 4
}, {
    id: 5,
    name: 'Product 5',
    variantId: 4
}]");

Как мне получить массив всех массивов, variantId которых равен 1? То есть, в итоге, что бы было это:

var products = JArray.Parse(@"[{
    id: 1,
    name: 'Product 1',
    variantId: 1
}, {
    id: 2,
    name: 'Product 2',
    variantId: 1
}, {
    id: 3,
    name: 'Product 3',
    variantId: 1
}]");

Ответы (1 шт):

Автор решения: Mark Shevchenko

Ответ 1

Возможно, вы знаете то значение variantId, по которому хотите фильтровать. Если так, то фильтрация осуществляется с помощью метода Where:

var filtered = products.Where(x => x.variantId == 1);

Или, в облегчённом синтаксисе:

var filtered = from product in products
               where product.variantId = 1
               select product;

Ответ 2

Возможно, вы хотите получить все массивы с разными значениями variantId, которые встречаются в массиве. В этом случае вам нужна группировка:

var groups = products.GroupBy(x => x.variantId);

foreach (var group in groups)
{
    Console.WriteLine(group.Key); // уникальное значение ключа группы, в нашем случае variantId
    foreach (var elements in group)
    {
        Console.WriteLine($"id: {group.id}, name: {group.name}");
    }
}
→ Ссылка