gpt4 book ai didi

c# - 替代 IEnumerable.Skip(1).Take(1).Single()

转载 作者:太空狗 更新时间:2023-10-29 22:08:43 58 4
gpt4 key购买 nike

我遇到了一个看似简单而令人尴尬的问题。我想要的只是 IEnumberable 中的下一个元素,而不使用 Skip(1).Take(1).Single()。这个例子说明了基本问题。

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 抱歉,双关语不好。)

最佳答案

All my problems would be solved if there was a function like:

_nextChar = getAlphabet().moveNext() //or getNext()

有一个函数完全是这样的。它只属于IEnumerator<T> , 不是 IEnumerable<T> !

private char _nextChar;
private IEnumerable<char> getAlphabet()
{
yield return 'A';
yield return 'B';
yield return 'C';
}

public void sortAlphabet()
{
using (var enumerator = getAlphabet().GetEnumerator())
{
while (enumerator.MoveNext())
{
char alpha = enumerator.Current;
switch (alpha)
{
case 'A':
if (enumerator.MoveNext())
{
_nextChar = enumerator.Currrent;
}
else
{
// You decide what to do in this case.
}
break;
case 'B':
// etc.
break;
}
}
}
}

不过,这里有一个问题要问你。此代码是否有必要使用 IEnumerable<char> , 而不是 IList<char> ?我问是因为,好像这并不明显,如果您可以随机访问 getAlphabet 返回的项目,代码会简单得多。按索引(如果有人想指出您可以使用 ElementAt 来做到这一点,请现在就把这个想法从您的脑海中抛开)。

我的意思是,考虑一下在这种情况下代码会是什么样子:

private char _nextChar;
private IList<char> getAlphabet()
{
return Array.AsReadOnly(new[] { 'A', 'B', 'C' });
}

public void sortAlphabet()
{
IList<char> alphabet = getAlphabet();
for (int i = 0; i < alphabet.Count - 1; ++i)
{
char alpha = alphabet[i];
switch (alpha)
{
case 'A':
_nextChar = alphabet[i + 1];
break;
case 'B':
// etc.
break;
}
}
}

这不是更容易吗?

关于c# - 替代 IEnumerable<T>.Skip(1).Take(1).Single(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3591326/

58 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com