快速排序对象列表以匹配包含属性值的数组的顺序

时间:2017-11-18 02:16:10

标签: c# arrays sorting collections ienumerable

我有一个接受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的排序无关紧要,但在引用整个结果时它们应保持不变。

1 个答案:

答案 0 :(得分:2)

您需要的是从对象字符串值到对象本身的映射。像

这样的东西
IDictionary<string, T>

只需创建此映射(在排序之前或之后),并在根据字符串值完成排序后,通过迭代(排序)字符串列表并使用映射获取相应的值来创建新的T排序列表吨。

编辑:根据注释,字符串值可能不是全部不同,您需要做的就是创建从字符串到Ts的集合/列表的映射。像,

IDictionary<string, IList<T>>

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

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

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