2011-11-18 35 views
1

我有以下結構有沒有像.NET Dictionary那樣用重複鍵填充文本文件?

01|value|value|value|value|value|value 
02|value|value|value|value|value|value 
03A|value|value|value|value|value|value 
03A|value|value|value|value|value|value 
. 
. 
N 
04|value|value|value|value|value|value 
05|value|value|value|value|value|value 
06|value|value|value|value|value|value 
. 
. 
N (variable lines) 

我試圖讀取該文本文件,並以使用它像MyDic["01"][0]添加到<string, string[]>類型的字典的文本文件,這是代碼的片段:

Dictionary<string, string[]> txtFromFile= new Dictionary<string, string[]>(); 
string strLine; 
using (StreamReader sr = new StreamReader(filePath)) 
{ 
    while ((strLine= sr.ReadLine()) != null) 
    { 
     string[] strNodes= strLine.Split('|'); 
     txtFromFile.Add(strNodes[0], strNodes); 
    } 
} 

不幸的是,你可以看到,這個文本文件可能有重複鍵,如03A,所以我在想,如果有一個在C#中的回收來實現這一點。

注意我看到一個名爲lookup的類,但沒有它的構造函數。

  1. 任何想法我的朋友?
  2. 你有什麼建議?

謝謝!

回答

2

可以使用ToLookup擴展方法:

string[] lines = File.ReadAllLines(filePath); 
ILookup<string, string[]> result = lines 
    .Select(line => line.Split('|')) 
    .ToLookup(parts => parts[0]); 
+0

這並不完全符合需要,因爲他希望從查找返回的是分割字符串,這將是line.Split('|')的值,但它很接近,我正在挑剔。 – doctorless

+0

如果你有.NET 4,使用'ReadLines()'(它返回'IEnumerable ')而不是'ReadAllLines()',它將整個文件加載到你不需要的數組中。 – dahlbyk

+0

@d_r_w就是這樣做 - 'result'具有類型'ILookup '。 – dahlbyk

1

你可以使用List<KeyValuePair<string, string[]>>List<Tuple<string, string[]>>

(當然,你可能會喜歡不同的集合類型,而不是List<>

+0

+1除了也許他會想要:'List >' – AaronLS

+0

@AaronLS當然你是對的;感謝您指出監督。 – phoog

1

第一問題在於如果您使用相同的密鑰關注多個條目,則您嘗試使用錯誤的類型。您可以通過List<KeyValuePair<string, string[]>>和您自己的查找功能(可能通過擴展該類)來實現此目的,或者可以在字典中添加另一個字典作爲值類型:Dictionary<string, Dictionary<int, string[]>>。字典選項更好,因爲它具有更好的性能。

2

爲什麼不只是創造這樣

public class MyLine 
{ 
    string key { get;set;} 
    string[] value {get;set;} 
} 

類並將其存儲在一個geneirc列表

,那麼你可以使用LINQ查詢任何你想要的......

+0

與字典相比,這是一個主要的性能問題,它是O(1),列表的最好情況是O(n)。 – doctorless

+0

他沒有獨特的鍵... –

+0

這可以解決,與不同的TValue – doctorless

0

我不是當然,如果您嘗試將第一個03A行的值與第二個03A行的值區分開來,但我認爲您正在尋找NameValueCollectionNameValueCollections允許您將多個值添加到同一個鍵,並且Add()方法應該在追加值/創建新的鍵/值條目之前檢查預先存在的鍵。

有一個在MSDN參考文章底部使用NameValueCollection方法的好例子,所以您應該可以使用它來確定它是否真的需要。

1

帶有自定義類型的列表如何?

class KeyValue 
{ 
String ID { get ; set ; } 
List<String> Values { get ; private set ;} 
(..Constructor etc...) 
} 

List<KeyValue> myValues = new List<KeyValue>(); 
while ((strLine= sr.ReadLine()) != null) 
{ 
string[] strNodes= strLine.Split('|'); 
myValues.Add(new KeyValue(strNodes[0],strNodes)); 
} 
0

另一種認爲是使用

Dictionary<string, List<string[]>> 

其中「串」是可以被重複的值。當它重複時,你在裏面創建另一個字典。如果一行存在一次,它將有一個List。如果找到重複行,則添加另一行。通過這種方式,您可以看到有多少重複行只有列表的數量。