2017-12-02 75 views
0

我已經嘗試了下面的代碼,在添加它之前刪除字典中的重複鍵。使用C#中的LINQ刪除字典中的重複鍵

樣品的編號:

string conString = "Host = local;UserName = UID; Password = PWD;Host =localhost"; 
     var sp = conString.Split(';'); 
     Dictionary<string, string> keyValue = new Dictionary<string, string>(); 
     foreach (var k in sp) 
     { 
      if (k.Contains('=')) 
      { 
       var conSP = k.Split(new char[] { '=' }, 2); 
       if (keyValue.All(i => 
       i.Key != conSP[0])) 
        keyValue.Add(conSP[0], conSP[1]); 
      } 
     } 

示例結果

KEYVALUE [0]。重點=主機,KEYVALUE [0]。價值=本地
KEYVALUE [1]。重點= username,KeyValue [1] .Value = UID
KeyValue [2] .Key = Password,KeyValue [2] .Value = PWD

但我需要使用linq相同的結果。所以我試着用linq下面的代碼來獲取輸出。

var keyValue = conString.Split(';') 
           .Where(kvp => kvp.Contains('=')) 
           .Select(kvp => kvp.Split(new char[] { '=' }, 2)) 
           .ToDictionary(kvp => kvp[0].Trim(),kvp => kvp[1].Trim(),StringComparer.InvariantCultureIgnoreCase); 

但在這段代碼中,我得到了下面的異常。

「具有相同鍵的項已被添加」

任何人都可以建議我如何解決這個問題?

在此先感謝。

+7

字典只允許唯一的密鑰,所以你不能有重複。 – jdweng

+1

爲什麼你必須使用linq? –

回答

0

由於@Sedat Kapanoglu描述;你不應該添加重複項目。添加前應檢查它。 因此,要刪除重複項,您可以像這樣執行它;

 var keyValue = conString.Split(';') 
      .Where(kvp => kvp.Contains('=')) 
      .Select(kvp => kvp.Split(new char[] { '=' }, 2)) 
      .GroupBy(kvp => kvp[0]) 
      .Select(kvp => kvp.FirstOrDefault()) 
      .ToDictionary(kvp => kvp[0].Trim(), kvp => kvp[1].Trim(), StringComparer.InvariantCultureIgnoreCase); 
1

你可以試試這個LINQ查詢:

var d = sp.Select(x => x.Split('=')) 
      .GroupBy(x => x[0]) 
      .Select(x => x.First()) 
      .ToDictionary(x => x[0], x=> x[1]); 

結果:

[Host , local] 
[UserName , UID] 
[Password , PWD] 
0

Connection String Builder是用於解析連接字符串的詳細發送給打印機,但它使最後一個值:

new System.Data.Odbc.OdbcConnectionStringBuilder(
           "Host = local;UserName = UID; Password = PWD;Host =localhost") 

結果:

Key   Value 
host  localhost 
username UID 
password PWD