Rog*_*oid 20 c# linq silverlight list unique
我一直在使用LINQ一段时间了,但似乎被困在关于Unique项目的东西上,我有下面的列表:
List<Stock> stock = new List<Stock>();
Run Code Online (Sandbox Code Playgroud)
它具有以下属性:字符串ID,字符串类型,字符串描述,示例:
public class Stock
{
public string ID { get; set; }
public string Type { get; set; }
public string Description { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我希望有一个LINQ查询,它将按照类型将库中的项目分组,并将其作为新的库存列表返回(它必须与原始库存列表的类型相同).
示例数据:
ID Type Description
----------------------------------------------
1 Kitchen Appliance Dishwasher
2 Living Room Television
3 Kitchen Appliance Washing Machine
4 Kitchen Appliance Fridge
Run Code Online (Sandbox Code Playgroud)
...
我的Linq查询希望能够返回所有的厨房用具示例.
所以我将它作为"类型"传递给查询,它将返回此示例列表中的项目1,3和4.
返回的列表也必须是以下类型:List<Stock>.
基本上我想要一个按类型列出的唯一项目,类似于SQL Distinct查询,我如何在LINQ中实现这一点?
替代解决方案很好,但必须只是Silverlight/C#客户端代码.
只是另一个澄清是我也可能不提供参数"厨房用具",可能只想要独特的参数,例如,它将返回厨房用具和起居室,只是类似于一个类别,无论多少类型有.
Dan*_*Tao 45
使用GroupBy和ToDictionary创建属性List<Stock>上键入的值字典Type:
var appliancesByType = stock
.GroupBy(item => item.Type)
.ToDictionary(grp => grp.Key, grp => grp.ToList());
Run Code Online (Sandbox Code Playgroud)
然后,您可以非常轻松地访问类型本身以及任何给定类型的列表:
// 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"];
Run Code Online (Sandbox Code Playgroud)
正如我所看到的,这种方法真正满足了您的所有需求.但对于其他一些选项,请参见下文.
您可以随时使用Where获取所需类型的项目,然后ToList将这些项目放入新项目中List<Stock>:
List<Stock> kitchenAppliances = stock
.Where(item => item.Type == "Kitchen Appliance")
.ToList();
Run Code Online (Sandbox Code Playgroud)
回应这最后一部分:
只是另一个澄清是我也可能不提供参数"厨房用具",可能只想要独特的参数,例如,它将返回厨房用具和起居室,只是类似于一个类别,无论多少类型有.
在这里,你似乎想要完全不同的东西:基本上是由提供的行为Distinct.对于此功能,您基本上可以使用Soonts的答案(可选地,返回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();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
58917 次 |
| 最近记录: |