C# - 将字典键/值插入新元组

时间:2016-04-28 16:45:02

标签: c# loops dictionary tuples

我已经阅读了一些类似的帖子,但很多人只是想要将字典插入元组,反之亦然。我的问题是我有两个单独的词典,我想用它来填补一个新的元组。

这两个词典有一些共同的信息,即用户的电子邮件。 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中的键都是用户&#39;电子邮件。我试图遍历所有内容,如果一个人的价值与另一个人的密钥匹配,那么用户的电子邮件,用户姓名和经理的电子邮件将用于创建一个元组,然后在循环中重新开始。

主要困难:如果我应该使用whileif循环,我会陷入困境。我担心范围,我应该在哪里return元组。我得到的一个错误是我返回一个空的/未分配的元组,我理解为什么根据我返回它的位置,但我不确定如何解决它。如何使用正确的循环等创建此元组?提前谢谢。

3 个答案:

答案 0 :(得分:3)

你可以用LINQ做你想做的事:

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

答案 1 :(得分:1)

尽管JRLambert的回答是最好的,但是我希望能够采用一些非常长且“经典”的方法,这对于那些不了解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", "andy@firm.com");
     addressBook.Add("Mary", "mary@firm.com");
     usersAndManagersList.Add("andy@firm.com", "jane@firm.com");

     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);
     }
  }

}

答案 2 :(得分:0)

您可以使用join或where语句在条件上匹配它们,然后从结果选择器中选择元组。 Join是一个更复杂的逻辑,但具有更好的性能。虽然大多数人的地方更具可读性

expect(page).to have_content(/19|18|17/)