Сравните два списка, чтобы определить, содержат ли оба списка одни и те же элементы с использованием лямбда-предикатов - PullRequest
0 голосов
/ 06 марта 2019

Я пытаюсь вернуть логическое значение, если мой список объектов содержит все типы в списке типов в vb.net или C #.Я пытаюсь написать лямбда-выражение для достижения этой цели.Можно ли это сделать с помощью лямбда-предикатов?Я знаю, что это легко сделать с помощью каждого цикла.

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

РЕДАКТИРОВАТЬ, спасибо за все быстрые ответы,Я вижу, что есть несколько способов сделать это, и теперь лучше понять, что происходит в выражении.

Ответы [ 6 ]

3 голосов
/ 06 марта 2019

Попробуйте var containsAllTypes = typeList.All(x => wList.Select(x => x.bearing).Contains(x))

2 голосов
/ 06 марта 2019

Я считаю, что вам нужно следующее:

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));
2 голосов
/ 06 марта 2019
var containsAll = typeList.All(type => 
    wList.Any(widget => widget.bearing.Equals(type)));

В переводе для всех типов в typeList верно, что любой (хотя бы один) виджет в списке имеет этот тип.

1 голос
/ 06 марта 2019
 Dim containsAllTypes As Boolean = wList.All(Function(a) typeList.Any(Function(b) b = a.bearing))

Для каждого значения в wList он проверяет, соответствуют ли какие-либо значения в typeList значению подшипника wList.

1 голос
/ 06 марта 2019

короче

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 голосов
/ 06 марта 2019

Вы можете использовать Intersect, чтобы проверить, имеют ли оба списка одинаковые значения. Попробуйте этот код

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

Если вам нужно иметь hasAll == true только если все типы в wList произошли один раз, удалите вызов Distinct

...