Гибкий подход
Используйте GroupBy
и ToDictionary
для создания словаря List<Stock>
значений, введенных в ключе свойства Type
:
var appliancesByType = stock
.GroupBy(item => item.Type)
.ToDictionary(grp => grp.Key, grp => grp.ToList());
Тогда вы можете довольно легко получить доступ к самим типам и списку для любого данного типа:
// List of unique type names only
List<string> stockTypes = appliancesByType.Keys.ToList();
// Or: list of one stock item per type
List<Stock> exampleStocks = appliancesByType
.Select(kvp => kvp.Value[0])
.ToList();
// List of stock items for a given type
List<Stock> kitchenAppliances = appliancesByType["Kitchen Appliance"];
Этот подход, на мой взгляд, действительно отвечает всем вашим потребностям.Но для некоторых других вариантов, см. Ниже.
Альтернативный (быстрый и грязный) подход
Вы всегда можете просто использовать Where
, чтобы получить предметы типа, который выхочу, затем ToList
, чтобы поместить эти элементы в новый List<Stock>
:
List<Stock> kitchenAppliances = stock
.Where(item => item.Type == "Kitchen Appliance")
.ToList();
В ответ на эту последнюю часть:
Еще одно уточнение: я также не могу предоставить параметр «Кухонный прибор» и могу просто захотеть уникальные, например, «Кухонный прибор» и «Гостиная» будут возвращены только один раз в категорию, независимо от того, сколько из нихТипа есть.
Здесь вы, кажется, хотите чего-то совершенно другого: в основном поведение, предоставляемое Distinct
.Для этой функциональности вы можете использовать Soonts's answer (опционально, возвращая IEnumerable<tKey>
вместо IEnumerable<tSource>
), или вы можете просто использовать Distinct
в сочетании с Select
, чтобы избежать необходимости применения IEqualityComparer<Stock>
(см. Ниже).
Обновление
В ответ на ваше разъяснение вот моя рекомендация: два метода, по одному для каждой цели( Принцип единой ответственности ):
// This will return a list of all Stock objects having the specified Type
static List<Stock> GetItemsForType(string type)
{
return stock
.Where(item => item.Type == type)
.ToList();
}
// This will return a list of the names of all Type values (no duplicates)
static List<string> GetStockTypes()
{
return stock
.Select(item => item.Type)
.Distinct()
.ToList();
}