【发布时间】:2021-07-11 09:06:25
【问题描述】:
我在执行 CodeWars 的练习时遇到了一些问题。我在另一个编译器中完成了它,一切正常,但在 CodeWars 中存在 IEnumerable 错误,我不知道如何处理它们。
所以,这是练习:
实现函数
unique_in_order,它以a为参数 序列并返回没有任何元素的项目列表 相同的值彼此相邻并保留原始顺序 元素。例如:
uniqueInOrder("AAAABBBCCDAABBB") == {'A', 'B', 'C', 'D', 'A', 'B'} uniqueInOrder("ABBCcAD") == {'A', 'B', 'C', 'c', 'A', 'D'} uniqueInOrder([1,2,2,3,3]) == {1,2,3}
我的解决方案:
using System.Collections.Generic;
public static class Kata {
public static IEnumerable<T> UniqueInOrder<T>(IEnumerable<T> iterable) {
var first = iterable[0];
var uniques = new List<char>();
uniques.Add(first);
foreach(var item in iterable)
{
if (item == first)
{
continue;
}
first = item;
uniques.Add(first);
}
var result = string.Join("", uniques);
return result;
}
}
我得到的错误:
src/Solution.cs(8,17):错误 CS0021:无法使用 [] 将索引应用于“IEnumerable
”类型的表达式
src/Solution.cs(26,12):错误 CS0029:无法将类型“字符串”隐式转换为“System.Collections.Generic.IEnumerable”
【问题讨论】:
-
如果您希望它在整数数组上工作,则不能使其成为 List
(或字符串的返回类型)。使用 List 并返回它 -
var first = iterable[0];- 你不能在这样的枚举中索引第一个项目。我很惊讶它在你的其他编译器中工作——哪一个?我认为T first = null;(或= default(T))和删除uniques.Add(first);可以正常工作。 -
尽管取决于测试用例的彻底程度,使用“第一个”布尔标志可能是最简单的,或者将 IEnumerable 解压缩到 IEnumerator 中并使用它来弹出列表的第一项。我也不认为您的返回字符串连接对于 int 列表和字符串情况都可以正常工作。您可能需要单独的字符串实现。
-
我觉得你应该迭代
iterable和yield return任何你发现与前一个 T 不同的 T,除非你正在使用 "并返回一个列表项目”部分字面意思
标签: c# ienumerable