2011-01-12 96 views
4

如何轉換String[]IDictionary<String, String>如何將String []轉換爲IDictionary <String,String>?

在指標0,2,4的值,......應鍵,因此在值的指數1,3,5,......應值。

例子:

new[] { "^BI", "connectORCL", "^CR", "connectCR" } 

=>

new Dictionary<String, String> {{"^BI", "connectORCL"}, {"^CR", "connectCR"}}; 
+0

這是類似的,但不是一個副本:http://stackoverflow.com/questions/1624341/getting-pair-set-using-linq – cfeduke 2011-01-12 15:10:49

+0

和http://stackoverflow.com/questions/4461367/linq-to-objects-return-pairs-of-numbers-from-list-of-numbers – cfeduke 2011-01-12 15:11:45

+2

如果你需要這麼多次,我建議你將你最喜歡的答案提取到一個擴展方法`IDictionary ToDictionary(這個字符串[] arr)` – HuBeZa 2011-01-12 15:18:32

回答

8
Dictionary<string,string> ArrayToDict(string[] arr) 
{ 
    if(arr.Length%2!=0) 
     throw new ArgumentException("Array doesn't contain an even number of entries"); 
    Dictionary<string,string> dict=new Dictionary<string,string>(); 
    for(int i=0;i<arr.Length/2;i++) 
    { 
     string key=arr[2*i]; 
     string value=arr[2*i+1]; 
     dict.Add(key,value); 
    } 
    return dict; 
} 
6

真的沒有簡單的方法在LINQ做到這一點(即使有的話,它肯定不會是清楚的意圖)。它很容易被一個簡單的循環,雖然完成:

// This code assumes you can guarantee your array to always have an even number 
// of elements. 

var array = new[] { "^BI", "connectORCL", "^CR", "connectCR" }; 
var dict = new Dictionary<string, string>(); 

for(int i=0; i < array.Length; i+=2) 
{ 
    dict.Add(array[i], array[i+1]); 
} 
+1

這個。你可以用LINQ來做,但是我發現一個簡單的`for`循環在這種情況下更具可讀性(和明顯的)。 – 2011-01-12 15:14:33

+0

@Anthony Pegram - 你說得對。通過使用Enumerable.Range()創建另一個集合,可以使用LINQ。我提出了你的答案,並同意for循環更清晰。 – 2011-01-12 15:15:48

+1

+1對於i + = 2而不是i ++ – 2011-01-12 15:39:41

11

我推薦一個好老for循環的清晰度。但是,如果你堅持LINQ查詢,這應該工作:

var dictionary = Enumerable.Range(0, array.Length/2) 
          .ToDictionary(i => array[2*i], i => array[2*i+1]) 
3

事情是這樣的,也許:

 string[] keyValues = new string[20]; 
     Dictionary<string, string> dict = new Dictionary<string, string>(); 
     for (int i = 0; i < keyValues.Length; i+=2) 
     { 
      dict.Add(keyValues[i], keyValues[i + 1]); 
     } 

編輯:在C#的標籤人們該死的快...

0

它看起來像其他人已經打我和/或有更有效的答案,但我張貼2種方式:

一個for循環可能是在這種情況下完成的最明確的方法...

var words = new[] { "^BI", "connectORCL", "^CR", "connectCR" }; 

var final = words.Where((w, i) => i % 2 == 0) 
       .Select((w, i) => new[] { w, words[(i * 2) + 1] }) 
       .ToDictionary(arr => arr[0], arr => arr[1]) 
       ; 

final.Dump(); 

//alternate way using zip 

var As = words.Where((w, i) => i % 2 == 0); 
var Bs = words.Where((w, i) => i % 2 == 1); 

var dictionary = new Dictionary<string, string>(As.Count()); 

var pairs = As.Zip(Bs, (first, second) => new[] {first, second}) 
       .ToDictionary(arr => arr[0], arr => arr[1]) 
       ; 

pairs.Dump(); 
0

僅供參考,這是我結束了使用循環和實現它作爲一個擴展的方法:

internal static Boolean IsEven(this Int32 @this) 
{ 
    return @this % 2 == 0; 
} 

internal static IDictionary<String, String> ToDictionary(this String[] @this) 
{ 
    if ([email protected]()) 
     throw new ArgumentException("Array doesn't contain an even number of entries"); 

    var dictionary = new Dictionary<String, String>(); 

    for (var i = 0; i < @this.Length; i += 2) 
    { 
     var key = @this[i]; 
     var value = @this[i + 1]; 

     dictionary.Add(key, value); 
    } 

    return dictionary; 
} 
1

如果你有Rx作爲一個依賴,你可以這樣做:

strings 
    .BufferWithCount(2) 
    .ToDictionary(
     buffer => buffer.First(), // key selector 
     buffer => buffer.Last()); // value selector 

BufferWithCount(int count)從輸入序列取第一count值,併產生作爲他們的列表,然後將其進行下一次count值等。即從你輸入序列,你會得到對作爲列表:{"^BI", "connectORCL"}, {"^CR", "connectCR"},將ToDictionary然後採取第一個列表項關鍵和最後的(==秒的兩個項目清單)的值。

但是,如果你不使用的Rx,你可以使用這個實施BufferWithCount

static class EnumerableX 
{ 
    public static IEnumerable<IList<T>> BufferWithCount<T>(this IEnumerable<T> source, int count) 
    { 
     if (source == null) 
     { 
      throw new ArgumentNullException("source"); 
     } 

     if (count <= 0) 
     { 
      throw new ArgumentOutOfRangeException("count"); 
     } 

     var buffer = new List<T>(); 

     foreach (var t in source) 
     { 
      buffer.Add(t); 

      if (buffer.Count == count) 
      { 
       yield return buffer; 
       buffer = new List<T>(); 
      } 
     } 

     if (buffer.Count > 0) 
     { 
      yield return buffer; 
     } 
    } 
} 
0

純LINQ的

  1. 選擇:項目原始字符串值和它的索引。
  2. 的GroupBy:組相鄰對。
  3. 轉換每組進入字典項。

string[] arr = new string[] { "^BI", "connectORCL", "^CR", "connectCR" };

var dictionary = arr.Select((value,i) => new {Value = value,Index = i}) 
       .GroupBy(value => value.Index/2) 
       .ToDictionary(g => g.FirstOrDefault().Value, 
            g => g.Skip(1).FirstOrDefault().Value); 

相關問題