2012-03-23 51 views
0

我試圖維護較大列表中較小列表的順序。假設有三個列表:重新排列具有多個子列表的主列表

List A = { Beef, Ham, Chicken } 
List B = { Cat, Monkey, Dog } 

List C = { Veal, Ham, Beef, Chicken, Deer, Dog, Cat, Monkey } 

名單A和B是C的子集,你可以看到,在一個項目都按順序在C.我想維持內A和B的順序C.因此,C的輸出應爲:

{ Veal, Beef, Ham, Chicken, Deer, Cat, Monkey, Dog } 

記住不在A或B項保持C(牛肉和鹿)有原始位置。而且,A或B中的項目總是在一起。 C的排序必須在創建C之後完成,因爲A和B的順序可能會發生變化,如果發生這種情況,C必須更新。

如何實現這一目標?謝謝。

+0

你使用的是什麼語法?它是數組還是列表?這是否需要正好用於三個列表或任意數量的列表?性能是一個問題嗎? – 2012-03-23 18:56:43

+3

如果不能保留不在A或B中的物品的原始位置,該怎麼辦?例如。如果C是「{火腿,小牛肉,牛肉,雞,狗,貓,鹿,猴子}算法完成後C應該變成什麼? – 2012-03-23 19:01:35

+0

提示:通過提供(多件)真實代碼,使答案更容易。 – 2012-03-23 19:02:26

回答

0

你可以做這樣的事情。

var A = new List<string> { "Beef", "Ham", "Chicken" }; 
var B = new List<string> { "Cat", "Monkey", "Dog" }; 
var C = new List<string> { "Veal", "Ham", "Beef", "Chicken", "Deer", "Dog", "Cat", "Monkey" }; 

// To quickly check if C[i] belongs to the corresponding list. 
var sA = new HashSet<string>(A); 
var sB = new HashSet<string>(B); 
List<string> currentList = null; 
int pos = 1; 
for (int i = 0; i < C.Count; i++) 
{ 
    string el = C[i]; 
    if (currentList != null) 
    { 
     if (pos == currentList.Count) 
     { 
      pos = 1; 
      currentList = null; 
     } 
     else 
     { 
      C[i] = currentList[pos]; 
      pos++; 
     } 
    } 
    else if (sA.Contains(el)) 
    { 
     currentList = A; 
     C[i] = currentList[0]; 
    } 
    else if (sB.Contains(el)) 
    { 
     currentList = B; 
     C[i] = currentList[0]; 
    } 
} 

// Outputs "Veal,Beef,Ham,Chicken,Deer,Cat,Monkey,Dog" 
Console.WriteLine(string.Join(",", C)); 
2

的C不應該是一個列表,它應該是列表的列表。

這樣,C從未有它自己的子列表元素單獨訂購,所以重新排序子列表會自動反映到C,無任何多餘的動作。屆時,您可以使用SelectMany輕鬆「平整」C語言。

例如:

class Program { 

    static void Main(string[] args) { 

     var A = new List<string> { "Ham", "Beef", "Chicken" }; 
     var B = new List<string> { "Cat", "Dog", "Monkey" }; 
     var C = new List<List<string>> { 
      new List<string> { "Veal" }, 
      A, 
      new List<string> { "Deer" }, 
      B 
     }; 

     Console.WriteLine("ORIGINAL LIST:"); 
     foreach (var element in C.SelectMany(l => l)) 
      Console.WriteLine(element); 

     // Now reorder one of the sub-lists (swap "Ham" and "Beef"): 
     var tmp = A[0]; 
     A[0] = A[1]; 
     A[1] = tmp; 

     Console.WriteLine("\nREORDERED LIST:"); 
     foreach (var element in C.SelectMany(l => l)) 
      Console.WriteLine(element); 

    } 

} 

此打印:

ORIGINAL LIST: 
Veal 
Ham 
Beef 
Chicken 
Deer 
Cat 
Monkey 
Dog 

REORDERED LIST: 
Veal 
Beef 
Ham 
Chicken 
Deer 
Cat 
Monkey 
Dog 

此假設下,所有作品的子列表是不相交的。如果某些元素在多個子列表之間共享,但只需在C中存在一次,則此模型會崩潰。但是,再一次,你的原始模型也會崩潰,所以我冒昧地認爲情況並非如此。

+0

不相交的假設是正確的。我喜歡你的解決方案,但是,Gebb的答案也是正確的,但他首先回答。這種情況下的禮儀禮儀是什麼?我想接受你的答案。 – morechitlins 2012-03-23 21:39:58

+0

@morechitlins一旦你獲得了足夠的聲望,你就可以同時勝利;)除此之外,如果你認爲新的答案比舊的答案更有用,你可以不接受舊答案並接受新答案。如果你認爲它們大致相等,那麼可以使用任何標準_你認爲合適,包括誰是第一。 – 2012-03-23 23:31:34