我已经阅读了一些类似的帖子,但很多人只是想要将字典插入元组,反之亦然。我的问题是我有两个单独的词典,我想用它来填补一个新的元组。
这两个词典有一些共同的信息,即用户的电子邮件。 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;电子邮件。我试图遍历所有内容,如果一个人的价值与另一个人的密钥匹配,那么用户的电子邮件,用户姓名和经理的电子邮件将用于创建一个元组,然后在循环中重新开始。
主要困难:如果我应该使用while
或if
循环,我会陷入困境。我担心范围,我应该在哪里return
元组。我得到的一个错误是我返回一个空的/未分配的元组,我理解为什么根据我返回它的位置,但我不确定如何解决它。如何使用正确的循环等创建此元组?提前谢谢。
答案 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/)