如果我的对象列表包含 vb.net 或 C# 中类型列表中的所有类型,我将尝试返回一个布尔值。我正在努力编写一个 lambda 表达式来实现这一点。这可以使用 lambda 谓词来完成吗?我知道可以通过 for each 循环轻松完成。VB.netPublic Class Widget Public wobbly As String Public sprocket As String Public bearing As StringEnd ClassPublic Sub test() Dim wList As New List(Of Widget) wList.Add(New Widget() With {.bearing = "xType", .sprocket = "spring", .wobbly = "99"}) wList.Add(New Widget() With {.bearing = "yType", .sprocket = "sprung", .wobbly = "45"}) wList.Add(New Widget() With {.bearing = "zType", .sprocket = "straight", .wobbly = "17"}) Dim typeList As New List(Of String) From {"xType", "yType", "zType"} Dim containsAllTypes As Boolean = wList.TrueForAll(Function(a) a.bearing.Equals(typeList.Where(Function(b) b = a.bearing))) Debug.WriteLine(containsAllTypes.ToString)End SubC#public class Widget{ public string wobbly; public string sprocket; public string bearing;}public void test(){ List<Widget> wList = new List<Widget>(); wList.Add(new Widget { bearing = "xType", sprocket = "spring", wobbly = "99" }); wList.Add(new Widget { bearing = "yType", sprocket = "sprung", wobbly = "45" }); wList.Add(new Widget { bearing = "zType", sprocket = "straight", wobbly = "17" }); List<string> typeList = new List<string> { "xType", "yType", "zType" }; bool containsAllTypes = wList.TrueForAll(a => a.bearing.Equals(typeList.Where(b => b == a.bearing))); Debug.WriteLine(containsAllTypes.ToString());}编辑,感谢所有快速回答,我看到有几种方法可以做到这一点,现在对表达式中发生的事情有了更好的理解。
5 回答
当年话下
TA贡献1890条经验 获得超9个赞
尝试var containsAllTypes = typeList.All(x => wList.Select(x => x.bearing).Contains(x))
绝地无双
TA贡献1946条经验 获得超4个赞
var containsAll = typeList.All(type => wList.Any(widget => widget.bearing.Equals(type)));
翻译后,对于所有类型typeList
来说,列表中的任何(至少一个)小部件都具有该类型。
沧海一幻觉
TA贡献1824条经验 获得超5个赞
我相信您想要的是以下内容:
bool containsAllTypes1 = wList.TrueForAll(a => null != typeList.Find(b => b == a.bearing));
您还可以使用 System.Linq,如下所示:
bool containsAllTypes2 = wList.All(a => typeList.Any(b => b == a.bearing));
繁花不似锦
TA贡献1851条经验 获得超4个赞
较短的是
containsAllTypes = wList.Where(x => typeList.Contains(x.bearing)).Count() == typeList.Count;
或者
containsAllTypes = wList.Select(x => x.bearing).Except(typeList).Count() == 0;
或者
containsAllTypes = wList.Select(x => x.bearing).Intersect(typeList).Count() == typeList.Count;
森栏
TA贡献1810条经验 获得超5个赞
Dim containsAllTypes As Boolean = wList.All(Function(a) typeList.Any(Function(b) b = a.bearing))
对于 wList 中的每个值,它会检查 typeList 中的任何值是否与 wList 方位值匹配。
- 5 回答
- 0 关注
- 201 浏览
添加回答
举报
0/150
提交
取消