2017-11-18 133 views
1

我有一种方法可以接受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

您是否需要使用customSortFunction()作为一个整体?你能比较两个字符串吗?像'bool customCompare(string1,string2);'? – realharry

+0

不需要我必须使用自定义功能。我必须将它作为一个整体传递给它。 –

+0

好的。我想这是因为性能的原因?因为可以通过调用'customSortFunction()'并在排序前后比较对,轻松实现'customCompare()'函数。 (一对是一个列表,毕竟是一个2元素的列表。) – realharry

回答

2

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

IDictionary<string, T> 

东西(前或选后)刚创建这个映射,和排序基于它们的字符串值完成后,创建T的新排序列表,通过了(排序)字符串列表进行迭代,并使用映射得到相应的T.编辑:基于字符串值可能不是全部不同的评论,所有你需要做的就是创建一个从字符串映射到TS的集合/列表。喜欢的东西,

IDictionary<string, IList<T>> 

[A]当您通过IEnumberable循环,(1)如果你看到一个新的(串)键,创建一个新的列表,并添加所有者T代表的字符串,和(2)如果您找到字典中已有的密钥,请检索列表,然后将新的所有者T追加到列表中。

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

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

+0

我没有指定,但我会编辑我的问题。虽然不太可能,但字符串可能并不唯一。 –

+0

我认为这种方法仍然可以追求,但是您必须使用[Object.ReferenceEquals](https://msdn.microsoft.com/zh-cn/library/system.object)创建实现相等性的替代密钥类型。的ReferenceEquals(V = vs.110)的.aspx)。这样,具有相同值的不同字符串实例在字典中不会相同。只需留意那条老狗[String.Intern](https://msdn.microsoft.com/en-us/library/system.string.intern(v = vs.110).aspx)。 – allonhadaya

+1

我在这个算法中看到的唯一问题(除了它可能不是最有效的事实之外)是排序可能不稳定。如果原始字符串排序算法不稳定,那么这不是问题。但是,如果原始字符串是稳定的,那么您将通过执行一对多映射来丢失该属性。 – realharry

相关问题