我有一个用于排序另一个值列表的值列表,但我遇到的问题是,如果我删除了要排序的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;
答案 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()
实现会考虑实例地址(当且仅当它们实际上是对同一实例的一个引用时,两个对象相等),而不是它们的值