使用LINQ的唯一项目列表

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

灵活的方法

使用GroupByToDictionary创建属性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)