我有一个接受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
的排序无关紧要,但在引用整个结果时它们应保持不变。
答案 0 :(得分:2)
您需要的是从对象字符串值到对象本身的映射。像
这样的东西IDictionary<string, T>
只需创建此映射(在排序之前或之后),并在根据字符串值完成排序后,通过迭代(排序)字符串列表并使用映射获取相应的值来创建新的T排序列表吨。
编辑:根据注释,字符串值可能不是全部不同,您需要做的就是创建从字符串到Ts的集合/列表的映射。像,
IDictionary<string, IList<T>>
[A]当您循环IEnumberable时,(1)如果您看到一个新的(字符串)键,则创建一个新列表并为该字符串添加所有者T,以及(2)如果您找到一个键是已经在字典中,检索列表,并将新所有者T附加到列表中。
[B]排序完成后,浏览排序后的字符串/键列表,找到相应的Ts(一个或多个),并通过连续追加Ts创建一个新的Ts列表。
这不是最优雅的方式(显然使用某种比较器的方法更好),但它很简单并且可以完成工作。