几个想法...
无论哪种方式,您都希望您的“项目订单字符串”作为一个数组,所以......
var sortOrder = correctItemOrder.Split(new[] { ", " }, StringSplitOptions.None);
然后一个选项是按 sortOrder 中的项目顺序对集合进行排序(这意味着您必须平均遍历集合中每个元素的一半 sortOrder):
var sortedCollection = new Collection<T>(collection.OrderBy(x => Array.IndexOf(sortOrder, x.Name)).ToList());
另一种选择是创建一个 Name => item 的字典,然后遍历 sortOrder,在你去的时候从这个字典中选择项目......
var dict = collection.ToDictionary(x => x.Name);
var sortedCollection = new Collection<T>(sortOrder.Select(x => dict[x]).ToList());
值得注意的是,如果将新项目添加到集合中,而不是 sortOrder,则第一个片段会将它们放在集合的开头,而第二个片段将完全丢弃它们。同样,如果 sortOrder 中存在项目但集合中不存在项目,第一个片段将忽略它们,而第二个片段将引发异常。
编辑:
当然,第三个选项是从 sortOrder 创建字典并使用它。
var dict = sortOrder.Select((x, i) => new { x, i }).ToDictionary(x => x.x, x => x.i);
var sortedCollection = new Collection<T>(collection.OrderBy(x => dict[x.Name]).ToList());
编辑2:
正如 Enigmativity 所指出的,使用查找而不是字典可以让您非常巧妙地处理字典键丢失的情况。
使用此技术的最后一个示例:
var lookup = sortOrder.Select((x, i) => new {x, i}).ToLookup(x => x.x, x => x.i);
var sortedCollection = new Collection<T>(collection.OrderBy(x => lookup[x.Name].DefaultIfEmpty(Int32.MaxValue).First()).ToList());