当前位置:  开发笔记 > 编程语言 > 正文

使用LINQ查询获取索引值的集合

如何解决《使用LINQ查询获取索引值的集合》经验,为你挑选了3个好方法。

有一个更好的方法吗?

string[] s = {"zero", "one", "two", "three", "four", "five"};

var x = 
s
.Select((a,i) => new {Value = a, Index = i})
.Where(b => b.Value.StartsWith("t"))
.Select(c => c.Index);

即我正在寻找一种更有效或更优雅的方式来获得符合标准的物品的位置.



1> Jon Skeet..:

您可以轻松添加自己的扩展方法:

public static IEnumerable IndexesWhere(this IEnumerable source, Func predicate)
{
    int index=0;
    foreach (T element in source)
    {
        if (predicate(element))
        {
            yield return index;
        }
        index++;
    }
}

然后用它:

string[] s = {"zero", "one", "two", "three", "four", "five"};
var x = s.IndexesWhere(t => t.StartsWith("t"));



2> tvanfosson..:

如果您只是使用该示例作为学习LINQ的方法,请忽略此帖子.


我不清楚LINQ实际上是最好的方法.下面的代码似乎更有效,因为不需要创建新的匿名类型.当然,您的示例可能是人为的,并且该技术在不同的上下文中可能更有用,例如在数据结构中可以利用值的索引,但下面的代码是相当直接的,可理解的(没有想到)要求)并且可以说更有效率.

string[] s = {"zero", "one", "two", "three", "four", "five"};
List matchingIndices = new List();

for (int i = 0; i < s.Length; ++i) 
{
   if (s[i].StartWith("t"))
   {
      matchingIndices.Add(i);
   }
}


而且,只有当您使用List而不是任意IEnumerable时,该确切代码才有效.否则你必须使用foreach和一个单独的局部变量.

3> Mark S. Rasm..:

对我来说似乎很好.您可以通过将选择更改为以下来保存几个字符:

.Select((Value, Index) => new {Value, Index})


它被称为"投影初始化器" - 它基本上采用表达式中的最后一个子表达式(必须是字段或属性)并将其用于名称.所以你可以做x.GetFoo().Bar,这相当于Bar = x.GetFoo().Bar.
推荐阅读
臭小子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有