如果我的对象列表包含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());
}
编辑,感谢所有快速答案,我看到有几种方法可以做到这一点,现在可以更好地了解表达式中发生的事情。
var containsAll = typeList.All(type =>
wList.Any(widget => widget.bearing.Equals(type)));
翻译过来,对于typeList
中的所有类型都是如此,列表中的任何(至少一个)窗口小部件都具有该类型。
试试var containsAllTypes = typeList.All(x => wList.Select(x => x.bearing).Contains(x))
我相信你想要的是以下内容:
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));
Dim containsAllTypes As Boolean = wList.All(Function(a) typeList.Any(Function(b) b = a.bearing))
对于wList中的每个值,它会检查typeList中的任何值是否与wList方位值匹配。
越短越好
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;
您可以使用Intersect
检查两个列表是否具有相同的值。试试这个代码
var hasAll = wList
.Select(w => w.bearing)
.Distinct()
.Intersect(typeList)
.Count() == typeList.Count;
如果你需要hasAll == true
只有wList
中的所有类型都出现过一次,请删除对Distinct
的调用