检查 list < t > 是否包含其他 list

我有一个这样的参数列表:

public class parameter
{
public string name {get; set;}
public string paramtype {get; set;}
public string source {get; set;}
}


IEnumerable<Parameter> parameters;

还有一个字符串数组,我想对它进行检查。

string[] myStrings = new string[] { "one", "two"};

我想迭代参数列表并检查 source 属性是否等于任何 myString 数组。我可以用嵌套 foreach 做到这一点,但是我想学习如何以一种更好的方式做到这一点,因为我一直在使用 linq,并且喜欢可枚举的扩展方法,比如 where 等,所以嵌套 foreach 感觉不对。有没有更优雅的首选 linq/lambda/committee 方法来实现这一点。

谢谢

196207 次浏览

你可以使用一个嵌套的 Any()来进行这个检查,它可以在任何 Enumerable上使用:

bool hasMatch = myStrings.Any(x => parameters.Any(y => y.source == x));

对于较大的集合,更快的执行方法是将 parameters投影到 source,然后使用 Intersect,它在内部使用 HashSet<T>,因此对于第一种方法(相当于两个嵌套循环) ,您可以在 O (n)中执行检查:

bool hasMatch = parameters.Select(x => x.source)
.Intersect(myStrings)
.Any();

另外,作为附加注释,您应该将类名和属性名大写,以符合 C # 风格的指导方针。

下面是一个示例,用于查找另一个列表中是否存在匹配元素

List<int> nums1 = new List<int> { 2, 4, 6, 8, 10 };
List<int> nums2 = new List<int> { 1, 3, 6, 9, 12};


if (nums1.Any(x => nums2.Any(y => y == x)))
{
Console.WriteLine("There are equal elements");
}
else
{
Console.WriteLine("No Match Found!");
}

如果这两个列表都太大,而且当我们使用 lamba 表达式时,那么它将需要很长时间来获取。在这种情况下,最好使用 linq 来获取参数列表:

var items = (from x in parameters
join y in myStrings on x.Source equals y
select x)
.ToList();
list1.Select(l1 => l1.Id).Intersect(list2.Select(l2 => l2.Id)).ToList();
var list1 = await _service1.GetAll();
var list2 = await _service2.GetAll();


// Create a list of Ids from list1
var list1_Ids = list1.Select(l => l.Id).ToList();


// filter list2 according to list1 Ids
var list2 = list2.Where(l => list1_Ids.Contains(l.Id)).ToList();