【问题标题】:LINQ search though a list of string arrays for a particular stringLINQ 搜索特定字符串的字符串数组列表
【发布时间】:2014-01-10 22:14:09
【问题描述】:

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

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

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

【问题讨论】:

  • 你不是很清楚:.Contains(..)查看第 0 个索引。您要使用第 0 个索引 only 还是 any 索引?
  • 有问题的字符串总是在第 0 个索引处。

标签: c# arrays linq


【解决方案1】:

您可以将所有内容放在一个查询中:

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

但它会一遍又一遍地迭代listOfValues

我宁愿选择HashSet&lt;string&gt; 让它更快:

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

【讨论】:

  • 好的,所以我遗漏了一些在使用 HashSet 时会遇到的细节。我比较它们的集合中的值是整数,所以我必须以一种或另一种方式进行转换。
  • 没关系,只需要调用 ToString()...我过度分析和混淆了自己,因为我以前从未使用过 HashSet。
  • 如果您的值是ints,请使用HashSet&lt;int&gt;
  • 嗯,集合中的值是 int,而 List 当然是字符串。我所做的是: someCollection.Where(x => set.Contains(x.ToString()));
  • 所以列表包含string 表示ints?这不好。
【解决方案2】:

试试下面的

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

【讨论】:

    【解决方案3】:
    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));
    

    【讨论】:

      【解决方案4】:

      应该很简单:

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

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

      【讨论】:

        猜你喜欢
        • 2013-04-11
        • 2020-09-29
        • 2023-03-28
        • 2013-03-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-27
        相关资源
        最近更新 更多