C# 根据固定格式对列表进行排序

C# 根据固定格式对列表进行排序,c#,C#,根据上面的两个列表,我需要根据OrderedListToFollow中定义的顺序对ListB进行排序。由于3,8,9不属于OrderedListToFollow的一部分,因此可接受的解决方案可能具有以下任意一种: int[] OrderedListToFollow = {1,2,4,5} int[] ListB = {2,3,4,8,9} 我试着按如下方式进行操作,但没有按顺序进行: int[] ListB = {2,4,3,8,9} int[] ListB = {2,4,8,3,9} int

根据上面的两个列表,我需要根据OrderedListToFollow中定义的顺序对ListB进行排序。由于3,8,9不属于OrderedListToFollow的一部分,因此可接受的解决方案可能具有以下任意一种:

int[] OrderedListToFollow = {1,2,4,5}
int[] ListB = {2,3,4,8,9}
我试着按如下方式进行操作,但没有按顺序进行:

int[] ListB = {2,4,3,8,9}
int[] ListB = {2,4,8,3,9}
int[] ListB = {2,4,9,3,8}
编辑


上面的顺序起作用,但它会先将OrderedListToFollow中不存在的项目放在后面,然后再放在其余的项目上。

排序方法的问题是,如果找不到项目,该方法将返回-1。因此,存在于给定排序方案之外的所有项目都被放置在集合的开头,因为它们的索引为-1

您可以尝试使用条件返回索引(如果找到),否则返回当前索引:

ListB = ListB.OrderBy(id => OrderedListToFollow.ToList().IndexOf(id)).ToArray();

排序方法的问题是,如果找不到项,则该方法返回-1。因此,存在于给定排序方案之外的所有项目都被放置在集合的开头,因为它们的索引为-1

您可以尝试使用条件返回索引(如果找到),否则返回当前索引:

ListB = ListB.OrderBy(id => OrderedListToFollow.ToList().IndexOf(id)).ToArray();

像这样的怎么样:

var c = ListB.Count();
ListB = ListB
    .OrderBy(id => OrderedListToFollow.Contains(id)
        ? OrderedListToFollow.ToList().IndexOf(id)
        : c + 1    // This will always pace invalid objects at the end
    );
int[]OrderedListToFollow={1,2,4,5};
int[]ListB={2,3,4,8,9};
List ListC=新列表();
AddRange(OrderedListToFollow.Where(p=>ListB.Contains(p));
AddRange(ListB.Where(p=>!OrderedListToFollow.Contains(p));
这将为您提供如下结果:

二, 4. 3. 8. 九,


像这样的怎么样:

var c = ListB.Count();
ListB = ListB
    .OrderBy(id => OrderedListToFollow.Contains(id)
        ? OrderedListToFollow.ToList().IndexOf(id)
        : c + 1    // This will always pace invalid objects at the end
    );
int[]OrderedListToFollow={1,2,4,5};
int[]ListB={2,3,4,8,9};
List ListC=新列表();
AddRange(OrderedListToFollow.Where(p=>ListB.Contains(p));
AddRange(ListB.Where(p=>!OrderedListToFollow.Contains(p));
这将为您提供如下结果:

二, 4. 3. 8. 九,


您可以使用Join和Except来实现这一点,其好处是它们都是~O(n)操作(因为它们在实现中都使用哈希表)。这个片段基于这样一个假设:OrderedListToFollow确实是有序的

int[] OrderedListToFollow = {1,2,4,5};
int[] ListB = {2,3,4,8,9};


List<int> ListC = new List<int>();
ListC.AddRange(OrderedListToFollow.Where(p => ListB.Contains(p)));
ListC.AddRange(ListB.Where(p => !OrderedListToFollow.Contains(p)));

您可以使用Join和Except来实现这一点,其好处是它们都是~O(n)操作(因为它们在实现中都使用哈希表)。这个片段基于这样一个假设:OrderedListToFollow确实是有序的

int[] OrderedListToFollow = {1,2,4,5};
int[] ListB = {2,3,4,8,9};


List<int> ListC = new List<int>();
ListC.AddRange(OrderedListToFollow.Where(p => ListB.Contains(p)));
ListC.AddRange(ListB.Where(p => !OrderedListToFollow.Contains(p)));

如前所述,它除了将结果放在一开始就已经开始工作了。要解决此问题,我将添加一个扩展方法:

int[] OrderedListToFollow = new[]{1,2,4,5};
int[] ListB = new[]{3,4,8,2,9};

var existing = from o in OrderedListToFollow
               join l in ListB on o equals l
               select l;

var other = ListB.Except(OrderedListToFollow);

var result = existing.Concat(other);

如前所述,它除了将结果放在一开始就已经开始工作了。要解决此问题,我将添加一个扩展方法:

int[] OrderedListToFollow = new[]{1,2,4,5};
int[] ListB = new[]{3,4,8,2,9};

var existing = from o in OrderedListToFollow
               join l in ListB on o equals l
               select l;

var other = ListB.Except(OrderedListToFollow);

var result = existing.Concat(other);

你说“不点菜”是什么意思?它有什么作用?(我希望它将8、3和9放在开头,因为IndexOf将返回-1…“不排序”意味着它保持ListB的原样……我对此非常怀疑。我怀疑你把它误诊了。请展示一个简短但完整的程序来演示这个问题。@JonSkeet my bad它是根据-1提前订购的。“不订购”是什么意思?它有什么作用?(我希望它将8、3和9放在开头,因为IndexOf将返回-1…“不排序”意味着它保持ListB的原样……我对此非常怀疑。我怀疑你把它误诊了。请展示一个简短但完整的程序来演示这个问题。@jonsket my bad它是根据-1排序的。这仍然有相同的问题,我使用以下方法解决了它:.OrderBy(id=>OrderedListToFollow.Contains(id)?OrderedListToFollow.ToList().IndexOf(id):ListB.ToList().Count()+1);在else条件下,你仍然有IndexOf(id),这意味着-1,并将它们放在开头,如果我使用Count+1,我只需确保它们放在最末尾(不存在的id),你能修复上面的代码吗,我会将其标记为answeredCount()将所述对象放在末尾,但IndexOf通过对源集合进行索引来保留其现有索引。将更新,抱歉延迟。这仍然存在相同的问题,我使用以下方法解决了它:.OrderBy(id=>OrderedListToFollow.Contains(id)?OrderedListToFollow.ToList().IndexOf(id):ListB.ToList().Count()+1);在else条件下,你仍然有IndexOf(id),这意味着-1,并将它们放在开头,如果我使用Count+1,我只需确保它们放在最末尾(不存在的id),你能修复上面的代码吗,我会将其标记为answeredCount()将所述对象放在末尾,但IndexOf通过对源集合进行索引来保留其现有索引。将更新,抱歉延迟。逻辑工作,但它对性能影响太大,这就是为什么我选择Aravol的答案逻辑工作,但它对性能影响太大,这就是为什么我选择Aravol的答案