2014-02-06 97 views
0

请帮助我用正确的谓词逻辑。遏制的谓词逻辑

我有一些产品的列表,我想在用户指定的某些区域显示。

我的产品类是下一个:

public class Product 
{ 
    public int id { get; set; } 
    public string name { get; set; } 
    public List<string> regions { get; set; } 
} 

我的设置类是:

public class LocalSettings 
{ 
    public List<string> Regions { get; set; } 
} 

因此,如果用户选择区域,例如逻辑是未来,欧洲则所有产品以“public List<string> regions “必须选择包含欧洲。

我应该如何正确地在谓词中写这个?

这里是我的起点:

Predicate<Product> ProductFinder = (Product p) => { return DataManager.Instance.CurrentSettings.Regions.Contains(//HERE MUST BE ANY OF p.regions); }; 

编辑的第1题:

感谢帮助我已经写了这个:

Predicate<Salesplay> SalesPlaysFinder = (Salesplay p) => { return DataManager.Instance.CurrentSettings.Regions.Intersect(p.regions).Any(); }; 

但我p.regions是一个列表我需要将其转换为字符串

我可以做类似.Intersect(p.regions.ToString()吗?

回答

2

如果我理解你的问题,你可以使用AnyContains方法是这样的:

Predicate<Product> ProductFinder = p => 
    DataManager.Instance.CurrentSettings.Regions.Any(r => p.regions.Contains(r)) 

或者你可以使用IntersectAny方法是这样的:

Predicate<Product> ProductFinder = p => 
    DataManager.Instance.CurrentSettings.Regions.Intersect(p.regions).Any() 

对于你更新的问题,如果你想测试列表中的单个字符串,只需使用Contains本身:

Predicate<Salesplay> SalesplayFinder = p => 
    DataManager.Instance.CurrentSettings.Regions.Contains(p.region) 
+0

您应该从lambda参数中删除类型名称。 – Magus

+0

@Magus是的好点。这是从变量声明中推断出来的。 –

+0

不好意思打扰了,但是我怎样才能在lambda表达式中进行转换? 查看我编辑的问题编号1 – Cheese