我正在尝试找到在多个 IEnumerable<T>
中查找精确匹配的最优雅的方法。集合,使用 AND 逻辑,而不是 OR 逻辑。
示例
public class IceCream
{
public string Flavor { get; set; } // "Vanilla", "Choc Chip", "Mint"
public bool ContainsNuts { get; set; }
public ServingType { get; set; } // "Cup", "Cone", "Waffle Cone"
public SprinklesType { get; set; } // "Choc", "HundredsAndThousands", "EdibleBallBearings"
}
我的第一步是希望能够通过单独的搜索词获取所有可用的冰淇淋:
IEnumerable<IceCream> IceCreamsByFlavor { get; set; }
IEnumerable<IceCream> IceCreamsByContainsNuts { get; set; }
IEnumerable<IceCream> IceCreamsByServingType { get; set; }
IEnumerable<IceCream> IceCreamsBySprinklesType { get; set; }
现在,我可以将它们组合在一起以获得具有该术语的任何属性的冰淇淋集合:
return Enumerable.Empty<IceCream>()
.Concat(IceCreamsByFlavor)
.Concat(IceCreamsByContainsNuts)
.Concat(IceCreamsByServingType)
.Concat(IceCreamsBySprinklesType)
.Distinct();
但是现在,假设我的搜索词是:
Search(
flavor: "Vanilla",
containsNuts: true,
servingType: ServingType.WaffleCone,
sprinklesType: SprinkesType.HundredsAndThousands);
如何获得 IEnumerable<IceCream>
只包含包含全部个术语的冰淇淋,而不是任何个术语?
最佳答案
您可以使用Intersect
而不是Concat
:
return IceCreamsByFlavor
.Intersect(IceCreamsByContainsNuts)
.Intersect(IceCreamsByServingType)
.Intersect(IceCreamsBySprinklesType);
它将仅返回所有集合中的项目。
请记住,根据相等比较的实现方式,您可能需要使用 overload of Intersect
with IEqualityComparer
关于c# - LINQ - 为多个结果集构建 AND 与 OR 逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40449990/