有一个更好的方法吗?
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);
即我正在寻找一种更有效或更优雅的方式来获得符合标准的物品的位置.
您可以轻松添加自己的扩展方法:
public static IEnumerableIndexesWhere (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"));
如果您只是使用该示例作为学习LINQ的方法,请忽略此帖子.
我不清楚LINQ实际上是最好的方法.下面的代码似乎更有效,因为不需要创建新的匿名类型.当然,您的示例可能是人为的,并且该技术在不同的上下文中可能更有用,例如在数据结构中可以利用值的索引,但下面的代码是相当直接的,可理解的(没有想到)要求)并且可以说更有效率.
string[] s = {"zero", "one", "two", "three", "four", "five"}; ListmatchingIndices = new List (); for (int i = 0; i < s.Length; ++i) { if (s[i].StartWith("t")) { matchingIndices.Add(i); } }
对我来说似乎很好.您可以通过将选择更改为以下来保存几个字符:
.Select((Value, Index) => new {Value, Index})