首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >比较两个列表以确定两个列表是否包含使用lambda谓词的相同项

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

Stack Overflow用户
提问于 2019-03-07 03:09:19
回答 6查看 107关注 0票数 0

如果我的对象列表包含vb.net或C#类型列表中的所有类型,我会尝试返回一个布尔值。我正在努力编写一个lambda表达式来实现这一点。使用lambda谓词可以做到这一点吗?我知道使用for each循环可以很容易地做到这一点。

vb.net

代码语言:javascript
复制
Public Class Widget
    Public wobbly As String
    Public sprocket As String
    Public bearing As String
End Class

Public 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 Sub

C#

代码语言:javascript
复制
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());
}

编辑,感谢你的快速回答,我看到有几种方法可以做到这一点,现在对表达式中发生的事情有了更好的理解。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2019-03-07 03:17:31

代码语言:javascript
复制
var containsAll = typeList.All(type => 
    wList.Any(widget => widget.bearing.Equals(type)));

经过转换,对于typeList中的所有类型,列表中的任何(至少一个)小部件都具有该类型。

票数 2
EN

Stack Overflow用户

发布于 2019-03-07 03:25:41

试试var containsAllTypes = typeList.All(x => wList.Select(x => x.bearing).Contains(x))

票数 3
EN

Stack Overflow用户

发布于 2019-03-07 03:26:51

我相信你想要的是:

代码语言:javascript
复制
bool containsAllTypes1 = wList.TrueForAll(a => null != typeList.Find(b => b == a.bearing));

您还可以按如下方式使用System.Linq:

代码语言:javascript
复制
bool containsAllTypes2 = wList.All(a => typeList.Any(b => b == a.bearing));
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55030513

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档