gpt4 book ai didi

c# 将字符串转换为 IEnumerable

转载 作者:太空宇宙 更新时间:2023-11-03 17:38:23 25 4
gpt4 key购买 nike

我有这个功能:

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;
}

现在所有的测试都通过了!谢谢!

最佳答案

实际上,字符串是字符的集合,因此当您使用 UniqueInOrder("AAAABBBCCDAABBB")您实际调用UniqueInOrder<char> , 而不是 UniqueInOrder<string> .因此该方法的返回值也将是 IEnumerble<char> ,而不仅仅是字符串。

因此,您应该将方法返回值与字符集合进行比较,例如:

CollectionAssert.AreEqual(new[] { 'A', 'B', 'C', 'D', 'A' 'B', 'Ä' }, UniqueInOrder(...));

或更简单:
CollectionAssert.AreEqual(expected.ToCharArray(), UniqueInOrder(...));

但即便如此,您的测试也会失败为 Distinct将过滤掉所有重复项。

当您想检查两个序列是否完全相同时,您可以使用 SequenceEqual反而:
var equal = firstColl.SequenceEqual(second);

编辑:显然,您正在尝试删除序列中的所有双倍字符。你可以使用这个:
public static IEnumerable<T> UniqueInOrder<T>(IEnumerable<T> iterable) where T : IEquatable<T>
{
T previous = default(T);
foreach (var t in iterable)
{
if (!t.Equals(previous))
yield return t;
previous = t;
}
}

现在您可以调用它并将其与您的预期输出进行比较,例如:
var actual = new String(UniqueInOrder("AABBCCDDAABB").ToArray());
var expected "ABCDAB";
Assert.AreEqual(expected, actual);

关于c# 将字符串转换为 IEnumerable<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46977089/

25 4 0