【问题标题】:c# - index of array entries inside another array using LINQc# - 使用 LINQ 在另一个数组中索引数组条目
【发布时间】:2016-07-26 00:40:48
【问题描述】:

我有一个字符串数组:

string[] stringArray = {"aaa", "bbb", "ccc", "aaa", "ccc", "ddd"};

我想获取该数组的所有索引,其中这些字符串的子字符串位于另一个数组中:

string[] searchArray = {"a","b"};

我想得到的答案是:

index = {0,1,3};

对于 searchArray 的一个条目的建议是:

List<int> index = stringArray.Select((s, i) => new { i, s })
            .Where(t => t.s.Contains(searchArray[1]))
            .Select(t => t.i)
            .ToList();

所有条目的解决方案是:

List<int> index = new List<int>();
foreach (string str in searchArray)
            index.AddRange(stringArray.Select((s, i) => new { i, s })
            .Where(t => t.s.Contains(str))
            .Select(t => t.i)
            .ToList());
index.Sort();

但出于好奇,有没有只在LINQ中使用一个命令的解决方案?

【问题讨论】:

    标签: c# arrays linq substring


    【解决方案1】:

    是的,您只需要Any 即可查看数组元素中是否包含“任何”目标字符串:

    List<int> index = stringArray
        .Select((Value, Index) => new { Value, Index })
        .Where(pair => searchArray.Any(target => pair.Value.Contains(target)))
        .Select(pair => pair.Index)
        .ToList();
    

    【讨论】:

    • 这段代码能用吗?是的,我会这样做吗?没有
    • @Eser:不用说你不喜欢它的什么,这不是非常有用。有什么问题?你有什么更好的解决方案?
    • 这是一个 O(n*n) 算法。 (如果我们包含value.Contains(target) O(n**3))。现在已经太晚了,但我会想到一个......
    • @Eser:鉴于一个数组的每个元素都需要与另一个数组的每个元素进行检查,并且您不能使用散列使其 O(n+m) 因为它是一个包含条件,不相等,我看不出如何避免它成为 O(n * m) 检查。如果没有至少一些相当清楚的想法怎么做,我不会声称这不是你会怎么做。我还要指出,没有迹象表明 OP 实际上会有大量数据。即使有更有效的方法,它几乎肯定会更复杂。过早的优化等等……
    • 我只是也不确定,但我会尝试通过在线性时间内进行预处理来使用lucene.apache.org/core/4_1_0/analyzers-stempel/org/egothor/… 之类的东西。 (顺便说一句:您更新了您的评论,并使此无效:()
    猜你喜欢
    • 2020-06-11
    • 1970-01-01
    • 1970-01-01
    • 2014-03-08
    • 1970-01-01
    • 2016-03-09
    相关资源
    最近更新 更多