【发布时间】:2011-04-05 05:09:30
【问题描述】:
我遇到了一个看似简单而令人尴尬的问题。我想要的是不使用 Skip(1).Take(1).Single() 的 IEnumberable 中的下一个元素。这个例子说明了基本问题。
private char _nextChar;
private IEnumerable<char> getAlphabet()
{
yield return 'A';
yield return 'B';
yield return 'C';
}
public void sortAlphabet()
{
foreach (char alpha in getAlphabet())
{
switch (alpha)
{
case 'A': //When A pops up, I want to get the next element, ie 'B'
_nextChar = getAlphabet().Skip(1).Take(1).Single();
break;
case 'B': //When B pops up, I want 'C' etc
_nextChar = getAlphabet().Skip(1).Take(1).Single();
break;
}
}
}
除了丑陋之外,这个例子还有效。但是假设 IEnumerable 包含 200 万个元素,那么 LINQ 语句会使程序执行速度慢得令人难以忍受。我想要的很简单。我只想要 IEnumberable 中的下一个元素。如果有这样的功能,我所有的问题都会得到解决:
_nextChar = getAlphabet().moveNext() //or getNext()
如果解决方案保持与示例相同的结构/布局/功能,则更好,但我很灵活。我的程序是一个文件解析器,在 200 万行文本中有一些键,例如“money=324”,其中“money”和“324”是 IEnumberable 中的相邻元素,当解析器遇到“money”时,我想要“ 324"。 (谁不呢?:D 对不起,双关语不好。)
【问题讨论】:
-
这段代码将始终检索序列的第二个元素,即'B',我认为这不是你想要的......
-
票数最高的答案已经回答了您的问题。但是,为了将来参考,您可以使用
.First()而不是.Take(1).Single(),它做同样的事情。 -
"假设 IEnumerable 包含 200 万个元素,那么 LINQ 语句会使程序执行速度慢得令人无法忍受。"是什么让你这么认为?
-
您应该改为解析可枚举的对。这很容易。
-
如果您正在编写文件解析器,使用 ANTLR、flex/bison 或开源 INI 阅读器等现成系统不是更容易吗?
标签: c# linq foreach ienumerable yield