2009-07-06 57 views
0

我有我想要添加到可以通過主鍵/索引進行訪問,但無法實現它一個哈希表或其它陣列字符串值的列表。我有這個工作,我怎麼想,但其醜陋使用列表<T>的ForEach添加元素的HashTable

 List<string> valueList = new List<string>(); 
     valueList.Add("1"); 
     valueList.Add("2"); 
     valueList.Add("3"); 

     Hashtable p = new Hashtable(); 


     valueList.ForEach(delegate(string f) { p.Add(valueList.FindIndex(v => v == f), f); }); 

編輯:詹姆斯提醒我之後,一個列表將通過索引返回值我去一個列表,這是我結束了

valueList.ForEach(f => sequenceList.Add(int.Parse(f))); 
+0

什麼你想在這裏做什麼?建立一個列表之外的哈希表,將索引映射到關鍵字? – 2009-07-06 15:11:03

+2

我很努力地看到你在做什麼的好處?如果你只是索引它,爲什麼不把它作爲一個List呢? – James 2009-07-06 15:21:32

+0

已決定將它作爲一個列表,謝謝 – Jon 2009-07-06 15:22:48

回答

1

試試這個:

valueList.ForEach(x => htable.Add(valueList.FindIndex(y => y == x), x)); 

雖然,真的沒有理由使用for這裏

for (var index = 0; index < valueList.Count; index++) 
{ 
    htable.Add(index, valueList[index]); 
} 

這是多行代碼,但它更簡單,將執行好得多(findIndex比使用for語句中的index效率低得多)。

1

假設您想要的字符串是鍵和索引是值:

Hashtable ht = new Hashtable(); 

for (var i = 0; i <= valueList.Count; i++) 
{ 
    ht.Add(valueList[i], i); 
} 

否則開關周圍的ht.Add參數。但是,如果是這種情況,最好只將它保留爲列表< string>。

0
List<string> list = new List<string>{"w", "y", "u", "i", "n"}; 

HashSet<string> hset = new HashSet<string>(list); 
4

即使編譯,這是行不通的 - 調用GetEnumerator().Current總是會失敗,因爲它會給你佈置的第一個項目之前迭代器。

你想要每個項目的關鍵是什麼?如果它只是它在列表中的位置,我沒有看到,讓你在一個列表(已被int索引)的利益。但是,你可以做這樣的(假設valueListList<string>

var dictionary = valueList.Select((item, index) => new { item, index }) 
          .ToDictionary(x => x.index, x => x.item); 

它添加到現有的字典,我只是做:

for (int i=0; i < valueList.Count; i++) 
{ 
    dictionary[i] = valueList[i]; 
} 

一切必須是與lambda表達式做:)

注意,這不會有同樣使用FindIndex如果你有重複的值完全一樣的效果。

0

及如何使用foreach這是沒有效率的,因爲你必須使用FindIndex,找出你在哪裏。它的工作原理,但你會做很多額外的工作:

valueList.ForEach(x => htable.Add(valueList.FindIndex(y => y == x), x)); 

最好是隻使用常規的循環,讓你得到該指數而不必通過表求:

for (int i = 0; i < valueList.Count; i++) { 
    htable.Add(i, valueList[i]); 
}