2016-04-28 33 views
1

我讀過一些類似的帖子,但很多人只是詢問關於插入字典到元組中,反之亦然。我的問題是我有兩個單獨的字典,我想用它來填充一個新的元組。C# - 將字典鍵/值插入新元組

這兩個字典有一些共同的信息,這是用戶的電子郵件。 addressBook字典包含用戶名和用戶的電子郵件。 usersAndManagersList包含用戶的電子郵件和經理的電子郵件。我希望將兩者匹配起來,然後將所有信息放在一個單獨的元組中,以便輕鬆地傳遞此信息而不是兩個字典。

public static Tuple<string, string, string> allUserInformation(Dictionary<string, string> addressBook, Dictionary<string, string> usersAndManagersList) 
    { 
     Tuple<string, string, string> allUserInfo; 

     foreach (var thing in addressBook) 
     { 
      foreach (var that in usersAndManagersList) 
      { 
       if (thing.Value == that.Key) 
       { 
        var userName = thing.Key; 
        var userEmail = thing.Value; 
        var managerEmail = that.Value; 

        Console.WriteLine("User: {0}, User's Email: {1}, Manager's Email: {2}", userName, userEmail, managerEmail); 

        allUserInfo = Tuple.Create(userName, userEmail, managerEmail); 
       } 
      } 
     } 

     return allUserInfo; 
    } 

addressBook和值在usersAndManagersList的按鍵都是用戶的電子郵件。我試圖循環一切,如果一個值與另一個的值匹配,那麼用戶的電子郵件,用戶名和管理員的電子郵件將用於創建一個元組,然後在循環中重新開始。

主要的掙扎:我卡住了,如果我應該使用whileif循環。我很擔心的範圍,我應該在哪裏return元組。我得到的一個錯誤是我返回一個空/未指定的元組,我明白爲什麼基於我返回的位置,但我不知道如何解決它。如何用正確的循環等創建這個元組?先謝謝你。

+0

您的代碼無法編譯,請修正。我假設你想遍歷'addressBook'和'usersAndManagersList',而不是遍歷每個''Values'和'Keys',並且你想要做'if(thing.Value == that.Key)',但是我不確定。此外,嘗試使用比'thing'和'that'更好的變量名稱。 – Quantic

+0

你應該把地址簿加入usersAndManagersList,然後在結果選擇器中選擇tupple。 –

+0

你正在返回一個'Tuple ',它只有一組值,I認爲你需要返回一個'IEnumerable >',基本上是一個'Tuple'數組。你可能也想看看Linq,這可以很簡單地枚舉你的數據並返回你想要的。 –

回答

0

您可以使用join或where語句在條件上匹配它們,然後從結果選擇器中選擇元組。加入是一個更復雜的邏輯,但性能更好。雖然這裏是更具可讀性大多數人

//Assuming that addressBook value (the users email) is the key for the usersAndManagersList 

var results = addressBook.Join(usersAndManagersList, addr => addr.Value, user => user.Key, (a, u) => { 
    var userName = a.Key; 
    var userEmail = a.Value; 
    var managerEmail = u.Value; 
    return Tuple.Create(userName, userEmail, managerEmail); 
}).ToList(); 
+0

我對加入字典不熟悉 - 用這種方法,我會將這部分插入兩個'foreach'循環嗎?這是如何工作的? – LaLaLottie

+0

in var結果將會是你創建的元組列表,你不需要任何foreaches –

+1

我最喜歡這種方法,儘管我最終使用對象而不是字典和元組。謝謝。 – LaLaLottie

3

你可以做你想做的與LINQ:

addressBook.Where(a => usersAndManagersList.ContainsKey(a.Value)) 
    .Select(a => Tuple.Create(a.Key, a.Value, usersAndManagersList[a.Value])) 
+0

這很容易閱讀+1 –

1

儘管JRLambert答案是我desided把一些很長,「最好的經典「的方法,對於不瞭解LINQ的人可能更易讀。

class Program 

{

public static IEnumerable<Tuple<string, string, string> > AllUserInformation(Dictionary<string, string> addressBook, Dictionary<string, string> usersAndManagersList) 
    { 
    foreach (var book in addressBook) 
    { 
     string managerEmail; 
     if (usersAndManagersList.TryGetValue(book.Value, out managerEmail)) 
     { 
      yield return Tuple.Create(book.Key, book.Value, managerEmail); 
     } 
     else 
     { 
      yield return Tuple.Create(book.Key, book.Value, string.Empty); 
     } 
    } 
    } 

    static void Main(string[] args) 
    { 
    Dictionary<string, string> addressBook = new Dictionary<string, string>(); 
    Dictionary<string, string> usersAndManagersList = new Dictionary<string, string>(); 
    addressBook.Add("Andy", "[email protected]"); 
    addressBook.Add("Mary", "[email protected]"); 
    usersAndManagersList.Add("[email protected]", "[email protected]"); 

    foreach (var allInfo in AllUserInformation(addressBook, usersAndManagersList)) 
    { 
     Console.WriteLine("User: {0}, User's Email: {1}, Manager's Email: {2}", allInfo.Item1, allInfo.Item2, allInfo.Item3); 
    } 
    } 

}