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

时间:2014-01-10 22:14:09

标签: c# arrays linq

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

List<String[]> listOfStringArrays = something;

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

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

List<String> listOfStrings = something;

我会这样做:

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

但显然字符串数组列表并不那么简单。

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

List<String[]> listOfStringArrays = something;
List<String> listOfValues = new List<String>();

foreach (string[] s in listOfStringArrays)
    listOfValues.Add(s[0]);

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

但是我真的想避免这种情况,并试图将其作为单行代码编写而不引入额外的列表和循环。

4 个答案:

答案 0 :(得分:7)

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

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

但它会一遍又一遍地重复listOfValues

我宁愿选择HashSet<string>来加快速度:

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

答案 1 :(得分:3)

尝试以下

var query = someCollection.Where(s => listOfStringArrays.Any(a => a[0] == s));

答案 2 :(得分:1)

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

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

作为一个班轮:

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

答案 3 :(得分:1)

应该简单地说:

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

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