gpt4 book ai didi

c# - CollectionAssert 与泛型一起使用?

转载 作者:IT王子 更新时间:2023-10-29 04:06:25 25 4
gpt4 key购买 nike

CollectionAssert 似乎不能与泛型一起使用。这太令人沮丧了;我要测试的代码确实使用了泛型。我是什么做的?编写样板文件以在两者之间进行转换?手动检查集合等效性?

这失败了:

ICollection<IDictionary<string, string>> expected = // ...

IEnumerable<IDictionary<string, string>> actual = // ...

// error 1 and 2 here
CollectionAssert.AreEqual(expected.GetEnumerator().ToList(), actual.ToList());

// error 3 here
Assert.IsTrue(expected.GetEnumerator().SequenceEquals(actual));

编译器错误:

错误一:

'System.Collections.Generic.IEnumerator>' does not contain a definition for 'ToList' and no extension method 'ToList' accepting a first argument of type 'System.Collections.Generic.IEnumerator>' could be found

错误 2

'System.Collections.Generic.IEnumerator>' does not contain a definition for 'ToList' and no extension method 'ToList' accepting a first argument of type 'System.Collections.Generic.IEnumerator>' could be found

错误 3

'System.Collections.Generic.IEnumerator>' does not contain a definition for 'SequenceEquals' and no extension method 'SequenceEquals' accepting a first argument of type 'System.Collections.Generic.IEnumerator>' could be found

我做错了什么?我没有正确使用扩展程序吗?

更新: 好吧,这看起来好多了,但仍然不起作用:

IEnumerable<IDictionary<string, string>> expected = // ...

IEnumerable<IDictionary<string, string>> actual = // ...

CollectionAssert.AreEquivalent(expected.ToList(), actual.ToList()); // fails
CollectionAssert.IsSubsetOf(expected.ToList(), actual.ToList()); // fails

我不想比较列表;我只关心集合成员平等。成员的顺序并不重要。我该如何解决这个问题?

最佳答案

可以使用CollectionAssert与通用集合。诀窍是理解 CollectionAssert方法在 ICollection 上运行, 尽管很少有通用集合接口(interface)实现 ICollection , List<T>

因此,您可以使用 ToList 绕过此限制。扩展方法:

IEnumerable<Foo> expected = //...
IEnumerable<Foo> actual = //...
CollectionAssert.AreEqual(expected.ToList(), actual.ToList());

也就是说,我仍然考虑CollectionAssert以很多其他方式损坏,所以我倾向于使用 Assert.IsTrue(bool)使用 LINQ 扩展方法,如下所示:

Assert.IsTrue(expected.SequenceEqual(actual));

FWIW,我目前正在使用这些扩展方法来执行其他比较:

public static class EnumerableExtension
{
public static bool IsEquivalentTo(this IEnumerable first, IEnumerable second)
{
var secondList = second.Cast<object>().ToList();
foreach (var item in first)
{
var index = secondList.FindIndex(item.Equals);
if (index < 0)
{
return false;
}
secondList.RemoveAt(index);
}
return secondList.Count == 0;
}

public static bool IsSubsetOf(this IEnumerable first, IEnumerable second)
{
var secondList = second.Cast<object>().ToList();
foreach (var item in first)
{
var index = secondList.FindIndex(item.Equals);
if (index < 0)
{
return false;
}
secondList.RemoveAt(index);
}
return true;
}
}

关于c# - CollectionAssert 与泛型一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2441188/

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