【问题标题】:Quickly sort list of objects to match the order of an array which contains the value of a property快速排序对象列表以匹配包含属性值的数组的顺序
【发布时间】:2018-05-01 21:19:58
【问题描述】:

我有一个接受string[] 的方法。它采用这个数组并根据我们拥有的自定义代数公式对其进行排序。这个代数公式非常复杂,不能(或不应该)适应除IEnumerable<string> 以外的任何东西。

我的任务是为此方法创建一个包装函数,该函数接受IEnumerable<T>,其中T 实现了一个接口,该接口公开了用于排序的字符串。

基于此,我创建了一个迭代遗传可枚举的方法,提取字符串并将结果数组传递给我们的自定义排序函数。这可行,但我最终得到了一个排序的字符串数组,与原始的 IEnumerable <T> 完全断开。如何对IEnumerable <T> 进行排序以匹配我们自定义排序函数返回的字符串数组?

例如。

private IEnumerable<T> Sort(IEnumerable<T> objects) where T: ICustomSortable
{
    string[] stringsToSort = new string[objects.Count()];
    for (int i = 0; i < stringsToSort.length; i++)
        stringsToSort[i] = objects.getString();

    stringsToSort = customSortFunction(stringsToSort);

    //somehow sort the objects so that they are in the same order as stringsToSort?
    /*
    The result is valid when:
     objects[0].getString() == stringsToSort[0]
     objects[1].getString() == stringsToSort[1]
     objects[2].getString() == stringsToSort[2]
      ...
     objects[n].getString() == stringsToSort[n]
    */
}

编辑:从customSortFunction 检索的字符串可能不是唯一的。这意味着两个字符串相同的objects 应该都存在于结果中。虽然具有相同字符串值的objects 的排序无关紧要,但在引用整个结果时它们应该保持原位。

【问题讨论】:

  • 是否需要整体使用customSortFunction()?你能比较两个字符串吗?喜欢bool customCompare(string1, string2);
  • 没有。我必须使用自定义功能。我必须将整个数组传递给它。
  • 好的。我想那是因为性能原因?因为您可以通过调用customSortFunction() 并比较排序前后的对来轻松实现customCompare() 函数。 (一对毕竟是一个列表,一个 2 元素列表。)

标签: c# arrays sorting collections ienumerable


【解决方案1】:

您需要的是从对象字符串值到对象本身的映射。类似的东西

IDictionary<string, T>

只需创建这个映射(排序之前或之后),并在根据它们的字符串值进行排序后,通过迭代(排序的)字符串列表并使用映射来获得对应的 T 的新排序列表T.

编辑:基于字符串值可能并不完全不同的评论,您需要做的就是创建从字符串到 T 集/列表的映射。类似的,

IDictionary<string, IList<T>>

[A] 当您在循环IEnumerable&lt;T&gt; 时,(1) 如果您看到一个新的(字符串)键,则创建一个新列表并为该字符串添加所有者 T,以及 (2) 如果您找到一个键已经在字典中,检索列表,并将新所有者 T 附加到列表中。

[B]排序完成后,遍历排序后的字符串/键列表,找到对应的Ts(一个或多个),通过连续追加Ts创建一个新的Ts列表。

这不是最优雅的方法(更好的方法显然是使用某种比较器),但它很简单并且可以完成工作。

【讨论】:

  • 我没有具体说明,但我会编辑我的问题。虽然不太可能,但字符串可能不是唯一的。
  • 我认为这种方法仍然可以采用,但您必须创建一个替代键类型,使用Object.ReferenceEquals 实现相等。这样,具有相同值的不同字符串实例在字典中就不会相等。请留意那条老狗String.Intern
  • 我在这个算法中看到的唯一问题(除了它可能不是最有效的)是排序可能不稳定。如果原始字符串排序算法不稳定,那么这不是问题但是,如果原始字符串是稳定的,那么通过执行此一对多映射,您将失去该属性。
  • 如果依赖引用相等,就不再存在一对多映射。
  • 不知道我是否理解。 OP 要求对字符串使用customSortFunction() 字符串是不可变的,相同的字符串通常具有相同的引用(在大多数运行时)。
猜你喜欢
  • 1970-01-01
  • 2021-06-15
  • 1970-01-01
  • 1970-01-01
  • 2012-05-24
  • 2016-05-18
  • 1970-01-01
  • 2014-12-22
相关资源
最近更新 更多