【发布时间】:2017-10-27 14:11:52
【问题描述】:
我有这个功能:
public static IEnumerable<T> UniqueInOrder<T>(IEnumerable<T> iterable)
{
return iterable.Distinct();
}
这适用于除字符串之外的任何 IEnumerable,我必须使用此调用对其进行测试:
Assert.AreEqual("ABCDAB", UniqueInOrder("AAAABBBCCDAABBB"));
断言失败:
Expected is <System.String>, actual is <System.Linq.Enumerable+<DistinctIterator>c__Iterator10`1[System.Char]>
Values differ at index [4]
我也尝试过类似的方法:
public static IEnumerable<T> UniqueInOrder<T>(IEnumerable<T> iterable)
{
return "abc";
}
但是我有一个编译器错误:
Cannot implicitly convert type 'string' to 'System.Collections.Generic.IEnumerable<T>'
我怎么可能用字符串调用函数但不能返回字符串?类型还是一样的 IEnumerable
有什么想法吗? 谢谢!
编辑: Distinct() 错了,我改成这样:
public static IEnumerable<T> UniqueInOrder<T>(IEnumerable<T> iterable)
{
List<T> result = new List<T>();
foreach (var c in iterable.ToList())
if (result.LastOrDefault() == null || !result.LastOrDefault().Equals(c))
result.Add(c);
return result;
}
现在所有的测试都通过了!谢谢!
【问题讨论】:
-
Distinct()不会返回多个相同的字母,那么您为什么期望返回值?至于第二个问题,你不能从那个方法返回一个字符串,因为一个字符串只满足IEnumerable<char>,而不满足任何其他类型T。 -
UniqueInOrder很好。Assert.AreEqual()需要字符串。 -
“我怎么可能用字符串调用函数,但我不能返回字符串” 你把参数和返回类型混为一谈了。字符串是
IEnumerable<char>,但它不能转换为任何类型的IEnumerable<T>。 -
@Matthew 是一个字符串 definitely is an
IEnumerable<char>,但对于除char之外的任何 T,它都不是IEnumerable<T>。 -
无论哪种方式
IEnumerable<T>和IEnumerable<char>都不相等。
标签: c# string generics casting ienumerable