LINQ搜索特定字符串的字符串数组列表

我有一个字符串数组列表:

List listOfStringArrays = something; 

我需要从集合中选择所有对象,其值等于列表中任何字符串数组的第0个索引处的字符串。

例如,如果我只有一个简单的字符串列表,声明为:

 List listOfStrings = something; 

我会这样做:

 var query = someCollection.Where(x => listOfStrings.Contains(x.id_num)) 

但显然,对于字符串数组列表来说并不是那么简单。

我知道我可以轻松地遍历字符串数组列表并创建一个带有第0个值的简单字符串列表,如下所示:

 List listOfStringArrays = something; List listOfValues = new List(); foreach (string[] s in listOfStringArrays) listOfValues.Add(s[0]); var query = someCollection.Where(x => listOfValues.Contains(x => x.id_num); 

但是我真的想避免这种情况,并试图将其写成一个内衬而不引入额外的列表和循环。

您可以将其全部放入一个查询中:

 someCollection.Where(x => listOfValues.Select(y => y[0]).Contains(x => x.id_num); 

但它会一遍listOfValues遍地遍历listOfValues

我宁愿使用HashSet来加快速度:

 var set = new HashSet(listOfValues.Select(y => y[0])); someCollection.Where(x => set.Contains(x)); 

请尝试以下方法

 var query = someCollection.Where(s => listOfStringArrays.Any(a => a[0] == s)); 
 var firsts = listOfString.Select(x => x[0]); var query = someCollection.Where(x => firsts.Contains(x)); 

这会将每个数组投影到它的第一个元素,然后从那里匹配

作为一个class轮:

 var query = someCollection.Where(x => listOfString.Select(y => y[0]).Contains(x)); 

应该简单地说:

 List newListOfStrings = listOfStrings.where(x => x[0].Contains(identifer)).ToList() 

在这种情况下需要最终的ToList ,因为我没有使用var