2011-12-16 22 views
5

我有兩個列表,我正在通過索引訪問(例如Name[10],Date[10])。他們密切聯繫,所以Name[10]Date[10]有關,反之亦然。排序兩個列表<T>作爲一個整體?

這種設計運行良好,但現在我需要對它們進行排序。我可以單獨對它們進行排序,但顯然這會消除這兩個列表之間的關係並使它們毫無價值。

我曾考慮過使用Dictionary<string, DateTime>來代替,但似乎我只能通過Key訪問它(這也是行不通的)。基本上我需要三件事情,兩個值和一個索引,我可以通過數字迭代(而不是foreach)。

任何人都可以幫忙嗎?看來我要麼需要改變數據結構或制定出如何排序兩種截然不同的List<T>在一起......

public class Results 
{ 
public List<string> Name { get; set; } 
public List<DateTime> Date{ get; set; } 
} 

for (int x = 0; x < results; x++) 
{ z.N = results.Name[X]; z.D = results.Date[x]; } 

回答

9

這聽起來像你對抗做明顯的解決方案,它涉及到一個位前期工作:創建一個類型來封裝名稱/日期對。

這就是絕對你應該怎麼做。然後,你可以有一個名單,按名稱或日期或任何你想要的,你永遠不用擔心兩個列表不同步等。

如果你的Results類別除了包含這兩個列表,您實際上可能會得到相同數量的類型 - 您可以完全丟棄Results,以List<Result>爲例,其中Result包含名稱和日期。

+0

他可以使用通用字典 – AMH 2011-12-16 23:33:59

+3

@AMH:OP已經認爲 - 它不保留順序,它基本上*不是*他試圖存儲的內容。他想要一個列表,但有兩個不同的值。 – 2011-12-16 23:34:57

+1

作爲一個額外的好處,這個解決方案將允許你給出一個明確的名字給你想要表達的任何概念,另外你可以在同一類型中嵌入用於處理這些數據的邏輯,而不是將它們全部散佈你的代碼在別處。 – 2014-03-13 14:58:49

2

請你幫個忙和兩件事情一起保留:

public class NameAndDate { 
    public string Name { get; set; } 
    public DateTime Date { get; set; } 
} 

然後你讓他們在一個列表(List<NameAndDate>):

如果你想通過名稱進行排序,添加IComparer實施到NameAndDate,那麼你可以在列表上打電話Sort()

如果你想保留訪問名字和日期,添加訪問方法的結果,像

public string GetName(int index) { 
    return list[i].Name; 
} 
1

您可以創建一個自定義類型來保存的值,或者如果你只需要使用它在單個方法的範圍內,您可以使用匿名類型,如下所示。

var namesAndDates = MyNames 
    .Select((name, i) => new {name, date = MyDates[i]}); 

從這裏兩個值不再鬆散地聯繫在一起。現在你可以排序他們。

var sortedNamesAndDates = namesAndDates.OrderBy(a => a.date); 

或其他你需要用它們做的事情。

0

你可以使用字典,項名稱和值日期

和U可以在排序後,他們很容易

2
List<Tuple<string,DateTime> NameDateList {get; set; } 

是一種簡單的方式來完成你想要什麼,但爲了清楚起見,你很可能最好讓一個自定義類型,以容納它們,例如:

public class NameDate 
{ 
    public string Name { get; set; } 
    public DateTime Date{ get; set; } 
} 

那麼你可以使用:

List<NameDate> NameDateList {get; set; } 
1

創建一個名爲「結果」類具有兩個屬性

public class Result 
{ 
    public string Name {set;get;} 
    public DateTime Date { set;get;} 
} 

現在,您可以創建此類

List<Result> objListResult=new List<Result>(); 

現在你的情況的列表,如果你願意,你可以閱讀您的個人清單的內容並將其放入我們的新清單。 (這只是特別針對你的情況,如果你真的想將數據從舊列表移動到我們的新列表中。如果可能的話,你可以更新代碼,將數據加載到兩個列表(這是正確的方式),這樣它會加載數據到我們的新類型的搜索結果列表和避免這種移植代碼將數據移動到新的列表。

for(int i=0;i<Name.Count;i++) 
{ 
    objListResult.Add(new Result { Name =Name[i].ToString(), Date[i].ToString() }); 
} 

您可以從新的列表訪問的項目,如本

objListResult[2].Date 

會給你日期存儲在列表中的第二個對象

objListResult[2].Name 

會給你在列表中

6

使用Array.Sort重載需要的按鍵陣列和值的數組存儲的第二個對象的名稱,它不正是你想要的。 (此方法自.NET 2.0起已可用。)