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

问题描述 投票:0回答:6

如果我的对象列表包含vb.net或C#中类型列表中的所有类型,我试图返回一个布尔值。我正在努力编写一个lambda表达式来实现这一目标。可以使用lambda谓词来完成吗?我知道可以使用for循环轻松完成。

VB.net

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#

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

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

c# .net vb.net lambda predicate
6个回答
2
投票
var containsAll = typeList.All(type => 
    wList.Any(widget => widget.bearing.Equals(type)));

翻译过来,对于typeList中的所有类型都是如此,列表中的任何(至少一个)窗口小部件都具有该类型。


3
投票

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


2
投票

我相信你想要的是以下内容:

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

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

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


1
投票

越短越好

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;

0
投票

您可以使用Intersect检查两个列表是否具有相同的值。试试这个代码

var hasAll = wList
 .Select(w => w.bearing)
 .Distinct()
 .Intersect(typeList)
 .Count() == typeList.Count;

如果你需要hasAll == true只有wList中的所有类型都出现过一次,请删除对Distinct的调用

© www.soinside.com 2019 - 2024. All rights reserved.