C#获取具有公共属性的所有项目

时间:2014-05-21 00:15:57

标签: c# linq

这应该相当简单,但我真的很头疼,我想我需要睡一觉。

我有一些代码中的列表

属性对象如下:

public class Properties {
    public int IdProperty 
    public int ProductId
}

这与KeyValue对很相似。举例说明这个值:

Product - Property
1          1
1          2
2          1
2          3
3          1
3          3

我想要的是从该列表中获取包含所有产品的属性(在本例中为id为1的属性)

返回列表应为:

1           1
2           1
3           1

这应该很简单,不是吗? (尝试使用lambda linq)

添加了试用的查询:

properties.Where(p => properties.All(x => x.IdProperty == p.IdProperty));
properties.Join(properties, p=>p.IdProperty, ... not sure what to put on other params);

一些疯狂的双向列表来匹配。

注意:我不知道共同财产。

3 个答案:

答案 0 :(得分:4)

return properties.Where(p => p.PropertyId == 1);

其中properties是包含您要从中选择的属性对象的IEnumerable<Properties>

修改 现在了解您的问题,获得所有产品共有的所有财产ID的一种方法是:

var productCount = properties.Select(p => p.ProductId).Distinct().Count();
return properties.Where(p => properties.Count(x => x.IdProperty == p.IdProperty) == productCount);

答案 1 :(得分:3)

我猜你不知道所有产品都有哪些属性......

// get number of products
var nbOfProducts = properties.Select(x => x.Product).Distinct().Count();

// group records by property
// and get only groups with number of items same as number of products
var result = properties.GroupBy(x => x.Property)
                       .Where(g => g.Count() == nbOfProducts)
                       .SelectMany(g => g);

答案 2 :(得分:-1)

yourCollection.Where(p => p.PropertyId == 1);

yourCollection.GroupBy(p => p.PropertyId);

第二个选项会对它们进行分组,以便在需要时可以获得其他选项。