c# - 使用属性对两个复杂类型的泛型集合进行排序

标签 c# generics

我有以下方法来比较任何给定复杂类型的两个集合。在执行序列相等操作之前,我需要使用要比较的类型的给定属性对两个集合进行排序,以确保对象的顺序相同。

    public static bool CompareCollections<T>(IEnumerable<T> expectedCollection, IEnumerable<T> actualCollection,Func<T,string> selector)
    {
        if (expectedCollection.Count() != actualCollection.Count())
        {
            return false;
        }
        expectedCollection.OrderBy(selector).ToList();
        actualCollection.OrderBy(selector).ToList();
        return expectedCollection.SequenceEqual(actualCollection, new TypeComparer<T>());
    }

我调用的方法如下

CompareCollections(first,second,x => x.ID)

第一个和第二个集合如下所示,注意两个集合都有相同的两个对象,但第二个集合的项目顺序相反,我希望 OrderBy 方法在比较之前对其进行排序平等。但它并没有按照我的预期排序

      var first = new List<Fee>()
      {
        new Fee
        {
            ID = "00001",
            BaseFee = "3.50"
        },
        new Fee
        {
            ID = "00002",
            BaseFee = "5.50"
        }
      };

      var second = new List<Fee>()
      {
        new Fee
        {
            ID = "00002",
            BaseFee = "5.50"
        },
        new Fee
        {
            ID = "00001",
            BaseFee = "3.50"
        }
      };

最佳答案

您需要将 OrderBy().ToList() 的结果分配给一个新的局部变量。 OrderBy返回一个有序序列,它不会就地对传入序列进行排序。因此:

var sortedExpectedCollection = expectedCollection.OrderBy(selector);
var sortedActualCollection = actualCollection.OrderBy(selector);

return sortedExpectedCollection.SequenceEqual(sortedActualCollection , new TypeComparer<T>());

关于c# - 使用属性对两个复杂类型的泛型集合进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31667208/

相关文章:

java - List<Dog> 是 List<Animal> 的子类吗?为什么 Java 泛型不是隐式多态的?

java - 与泛型和类作斗争

c# - 如何强制 Visual Studio *真的*停止执行?

javascript - 从带有皮肤的 3ds MAX 导入后,我的游戏内网格体统一反转

java - 如何将调用该方法的对象的类型指定为方法的返回类型?

C# Generics Efficiency,一种更好的方法

c# - 实现 IList 接口(interface)

c# - 在特定领域不同

c# - 如何将带有(')的字符串插入到sql数据库中?

c# - SslStream 异步方法始终返回 IAsyncResult,其中 CompletedSynchronously 为 True。为什么?