【问题标题】:C# - Inserting Dictionary Keys/Values into New TupleC# - 将字典键/值插入新元组
【发布时间】:2016-08-23 13:50:28
【问题描述】:

我读过一些类似的帖子,但很多人只是询问如何将字典插入元组,反之亦然。我的问题是我有两个单独的字典,我想用它们来填充一个新的元组。

这两个字典有一些共同的信息,就是用户的email。 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 元组。我得到的一个错误是我正在返回一个空/未分配的元组,我理解为什么根据我返回它的位置,但我不知道如何修复它。如何使用正确的循环等创建这个元组?提前谢谢你。

【问题讨论】:

  • 您的代码无法编译,请修复。我假设您想要遍历 addressBookusersAndManagersList,而不是遍历 ValuesKeys,并且您想要执行 if (thing.Value == that.Key),但我不确定。此外,尝试使用比thingthat 更好的变量名称。
  • 你应该把通讯录加入到 usersAndManagersList 中,然后在结果选择器中选择元组
  • 你返回一个Tuple&lt;string, string, string&gt;,它只有一组值,我认为你需要返回一个IEnumerable&lt;Tuple&lt;string, string, string&gt;&gt;,基本上是一个Tuple的数组。您可能还想查看 Linq,这可以非常简洁地枚举您的数据并返回您想要的内容。
  • 呵呵,我从没听说过if 循环;)。
  • @Quantic:是的,我犯了一个错误,打算添加thing.Value,that.Key等。我只是使用thingthat作为临时占位符来快速得到我想要的结构。对不起,我已经编辑了代码。 @Owain Williams:我希望在最后添加另一种方法,一次只拾取一个元组,所以我不需要处理数组......这么说,我可能不需要返回任何东西。

标签: c# loops dictionary tuples


【解决方案1】:

您可以使用连接或 where 语句在条件上匹配它们,然后从结果选择器中选择元组。 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();

【讨论】:

  • 我不熟悉加入字典 - 使用这种方法,我会将这部分粘贴到两个 foreach 循环中吗?是这样的吗?
  • 在 var 结果中将是您创建的元组的列表,您根本不需要 foreaches
  • 我最喜欢这种方法,尽管我最终使用对象而不是字典和元组。谢谢。
  • 谢谢它应该非常有效
【解决方案2】:

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

}

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-16
      • 1970-01-01
      • 1970-01-01
      • 2018-04-16
      相关资源
      最近更新 更多