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
接口将是低效的。