为了账号安全,请及时绑定邮箱和手机立即绑定

使用 lambda 谓词比较两个列表以确定两个列表是否包含相同的项目

使用 lambda 谓词比较两个列表以确定两个列表是否包含相同的项目

C#
拉莫斯之舞 2022-10-15 14:10:58
如果我的对象列表包含 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))



查看完整回答
反对 回复 2022-10-15
?
绝地无双

TA贡献1946条经验 获得超4个赞

var containsAll = typeList.All(type => 
    wList.Any(widget => widget.bearing.Equals(type)));

翻译后,对于所有类型typeList来说,列表中的任何(至少一个)小部件都具有该类型。


查看完整回答
反对 回复 2022-10-15
?
沧海一幻觉

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));


查看完整回答
反对 回复 2022-10-15
?
繁花不似锦

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;



查看完整回答
反对 回复 2022-10-15
?
森栏

TA贡献1810条经验 获得超5个赞

Dim containsAllTypes As Boolean = wList.All(Function(a) typeList.Any(Function(b) b = a.bearing))

对于 wList 中的每个值,它会检查 typeList 中的任何值是否与 wList 方位值匹配。


查看完整回答
反对 回复 2022-10-15
  • 5 回答
  • 0 关注
  • 201 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信