I\'ve been using LINQ for a while now, but seem to be stuck on something with regards to Unique items, I have the folling list:
List stock = new Lis
Use GroupBy and ToDictionary to create a dictionary of List
values keyed on the Type
property:
var appliancesByType = stock
.GroupBy(item => item.Type)
.ToDictionary(grp => grp.Key, grp => grp.ToList());
Then you can access the types themselves as well as a list for any given type quite easily:
// List of unique type names only
List stockTypes = appliancesByType.Keys.ToList();
// Or: list of one stock item per type
List exampleStocks = appliancesByType
.Select(kvp => kvp.Value[0])
.ToList();
// List of stock items for a given type
List kitchenAppliances = appliancesByType["Kitchen Appliance"];
This approach really takes care of all your needs, as I see it. But for some other options, see below.
You can always just use Where to get the items of the type you want, then ToList to put these items in a new List
:
List kitchenAppliances = stock
.Where(item => item.Type == "Kitchen Appliance")
.ToList();
In response to this last part:
Just another clarification is that I also may not provide the parameter "Kitchen Appliance" and may just want the unique ones, for example It would return Kitchen Appliance and Living Room once each only to kind of like a category no matter how many of that Type there are.
Here, you seem to be wanting something completely different: basically the behavior provided by Distinct. For this functionality, you could essentially go with Soonts's answer (optionally, returning an IEnumerable
instead of IEnumerable
), or you could just leverage Distinct
in combination with Select to avoid the need to implement an IEqualityComparer
(see below).
In response to your clarification, here's my recommendation: two methods, one for each purpose (Single Responsibility Principle):
// This will return a list of all Stock objects having the specified Type
static List 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 GetStockTypes()
{
return stock
.Select(item => item.Type)
.Distinct()
.ToList();
}