2014-09-25 30 views
0

我有一個值列表,用於對另一列值進行排序,但我一直遇到的問題是如果我刪除了要排序的值中的兩個值,那麼需要排序的值列表中的兩個值就會丟失這兩個值,因爲它在有序值列表中找不到。C#按另一個列表排序並將未找到的列表添加到列表末尾

這是我嘗試

嘗試的例子1

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

的社區學院是一個列表,該orderedUniversity是模型的列表中,listOrderedUniversites是一個列表。

然而,這確實拉出了所有的值,但它並沒有命令它們。

---更新---

這是我

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數組爲了我的清單;

+2

您能提供樣品清單和預期結果嗎?你的問題目前有點不清楚,因爲我看不出如何通過另一個列表排列一個列表,如果它們長度不一樣,以及爲什麼一個列表中的項目也應該在另一個列表中。 – 2014-09-25 08:26:34

+1

'd'是什麼?它是一些「大學」類嗎?如果是,你是否覆蓋了這個類的'Equals'和'GetHashCode'? – 2014-09-25 08:27:47

+0

@Matthew好吧,讓我們說有序大學是{1,5,4,2,3},大學是{1,2,3,4,5,6,7}我想命令大學看起來像{1, 5,4,2,3,6,7},列表的長度可能不同的原因是我將它們從數據庫中提取出來,並且只要添加了值,該表就可以增加,因此需要將新值添加到列表和有序列表中,否則它將永遠不會顯示 – Canvas 2014-09-25 08:31:40

回答

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類型正確覆蓋它們。

+0

永遠不會是重複的,但是你可以做一個List 和一個int數組嗎? – Canvas 2014-09-25 08:54:34

+0

@Canvas因爲我使用IEnumerable ',它可以處理任何實現了'IEnumerable '的東西,這幾乎每一個集合類型,包括整數和'List '的數組。您可以將列表和數組傳遞給上面顯示的'OrderBy()'方法。如果你希望返回類型是一個列表,只需在返回的值上調用'ToList()'。同樣,如果你想要一個數組,可以調用'ToArray()'。 – 2014-09-25 08:55:46

+0

請注意德米特里的評論如下:爲了能夠使用'Intersect()'和'Except()',你必須能夠正確地比較項目,所以對於一個自定義類型,你需要重寫'GetHashCode()'和'Equals ()'的類型。 – 2014-09-25 09:01:46

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()實現考慮實例地址(兩個對象相同,當且僅當它們實際上是對同一實例的一個引用),而不是它們的

相關問題