C#按其他列表排序列表,并将未找到的列表添加到列表末尾

时间:2014-09-25 08:15:27

标签: c# asp.net-mvc list

我有一个用于排序另一个值列表的值列表,但我遇到的问题是,如果我删除了要排序的2个值,那么需要的值列表中的两个值要排序丢失这两个值,因为它没有在有序值列表中找到。

以下是我的尝试示例

尝试1

universites = universites.OrderBy(d => listOrderedUniversites.IndexOf(d)).ToList();

Universites是一个List,orderedUniversity是一个模型列表,listOrderedUniversites是一个List。

然而,这确实提取了所有值,但它根本没有排序。

---更新---

这就是我所拥有的

universites = new List<SelectListItem>();
universites.Add( new SelectListItem()
{
    Value = 1,
    Test = "University 1"
});
universites.Add( new SelectListItem()
{
    Value = 2,
    Test = "University 2"
});
universites.Add( new SelectListItem()
{
    Value = 3,
    Test = "University 3"
});

ordering = new int[] {3, 1, 2};

所以我需要通过int数组来命令我的List;

2 个答案:

答案 0 :(得分:0)

[编辑]问题是如此不清楚,我不知道这是否是正确的答案。我不应该试图回答这个问题,但我会在此处留下来等待OP的澄清。

您可以使用Enumerable.Intersect()Enumerable.Except()执行此操作。

这是一个可编译的示例,使用整数(为简单起见)演示它:

using System;
using System.Collections.Generic;
using System.Linq;

namespace Demo
{
    internal class Program
    {
        private static void Main()
        {
            IEnumerable<int> ordered   = new [] {1, 5, 4, -1, 2, 3};
            IEnumerable<int> unordered = Enumerable.Range(1, 7);

            // This prints 1, 5, 4, 2, 3, 6, 7:

            Console.WriteLine(string.Join(", ", MyOrderBy(unordered, ordered)));
        }

        public static IEnumerable<T> MyOrderBy<T>(IEnumerable<T> unordered, IEnumerable<T> ordered)
        {
            return ordered.Intersect(unordered).Concat(unordered.Except(ordered));
        }
    }
}

请注意,这假设两个列表中都没有重复项。

另请注意,要使Intersect()Except()正常工作,元素的类型必须具有适合该类型的GetHashCode()Equals()实现。

这意味着适当地覆盖University类型。

答案 1 :(得分:0)

我模仿了正确和错误的行为:

  List<String> universites = new List<String>() {
    "E", "A", "D", "C", "B"
  };

  // Desired order: A, C, D; X, Z will be ignored
  List<String> listOrderedUniversites = new List<String>() {
    "A", "C", "D", "X", "Z"
  };

  // result is "E, B, A, C, D":
  // "E" and "B" are not in listOrderedUniversites
  // and so IndexOf() returns -1 for such values 
  // that's why "E", "B" appears in the begining of the list
  // all the other items ("A", "C", "D") are sorted as expected
  String result = String.Join(", ",
    universites.OrderBy(item => listOrderedUniversites.IndexOf(item)));

但是,如果您设置StringBuilder而不是String

  List<StringBuilder> universites = new List<StringBuilder>() {
    new StringBuilder("E"), 
    new StringBuilder("A"), 
    new StringBuilder("D"), 
    new StringBuilder("C"), 
    new StringBuilder("B")
  };

  List<StringBuilder> listOrderedUniversites = new List<StringBuilder>() {
    new StringBuilder("A"), 
    new StringBuilder("C"), 
    new StringBuilder("D"), 
    new StringBuilder("X"), 
    new StringBuilder("Z")
  };

  // Wrong order: "E, A, D, C, B" (note "A, D, C")
  String result = String.Join(", ", universites
    .OrderBy(item => listOrderedUniversites.IndexOf(item))
    .Select(item => item.ToString()));

原因是您必须覆盖 Equals()GetHashCode()方法 让List.IndexOf()正常工作。默认Equals()GetHashCode()实现会考虑实例地址(当且仅当它们实际上是对同一实例的一个引用时,两个对象相等),而不是它们的