Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LINQ从int[]中存储的索引创建字符串列表_C#_Linq - Fatal编程技术网

C# LINQ从int[]中存储的索引创建字符串列表

C# LINQ从int[]中存储的索引创建字符串列表,c#,linq,C#,Linq,这就是我所拥有的: int[] indexes; // it contains indexes that are "good" string[] words; // many words List<string> result; int[]索引;//它包含“良好”的索引 字符串[]个单词;//许多词 列出结果; 我想执行以下代码: for (int i = 0; i < words.Count(); ++i) if (indexes.Contains(i))

这就是我所拥有的:

int[] indexes; // it contains indexes that are "good"
string[] words; // many words
List<string> result;
int[]索引;//它包含“良好”的索引
字符串[]个单词;//许多词
列出结果;
我想执行以下代码:

for (int i = 0; i < words.Count(); ++i)
    if (indexes.Contains(i))
        result.Add(words[i]);
for(int i=0;i

只有一行,我想:)怎么办?

嗯,不是一行,而是:

result = Enumerable.Range(0, words.Count())
      .Where(indexes.Contains)
      .Select(idx => words[idx])
      .ToList();

假设一组不同的索引。我们可以抓取每个单词,而不是从单词开始寻找匹配的索引

List<string> result = indexes.Select(i => words[i]).ToList();
List result=index.Select(i=>words[i]).ToList();

请注意,假设索引小于单词,则此版本的速度要快得多。(100个索引和20000个单词在你的操作中等于2000万次,在我的操作中等于100万次)。

你完全可以用一行来写:-)在哪里(index.Contains)
有什么用?我想您必须编写
Where(w=>index.Contains(w))
@EricJ.:只要函数类型匹配有效。在本例中,它们都是
Func
。这是一个方法组,它等于
其中(w=>index.Contains(w)
。但实际上我不知道为什么我不能思考索引。选择:)这不就是一个
IEnumerable
?仍然需要.ToList()?@EricJ.:问题要求列出一个列表,但我发现人们倾向于要求他们的算法函数使用什么,而不是他们实际需要什么。固定匹配问题。同意,当接口提供更好的代码重用时,人们通常使用具体类而不是接口。@EricJ.:实际上
IList
是匹配的接口。在这种情况下,它是“我需要一个有序的可枚举项”和“我需要一个项目列表”之间的区别。后者更通用,因此如果合适,它更灵活。是的,
IList
将是合适的接口。然而,我同意,他是否需要额外的合同元素与IEnumerable相比并不清楚。如果不需要索引元素的能力,那么实例化
列表
只是返回
IList
接口将是低效的。