2016-04-28 2 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 оба письма пользователей. Я пытался перебрать все, и если значения одного совпадают с ключами другого, то для создания кортежа будет использоваться адрес электронной почты пользователя, имя пользователя и адрес менеджера, а затем начнется в цикле.

Основные проблемы: Я застреваю, если я должен использовать петлю while или if. Я беспокоюсь о масштабах и где именно должен быть return кортеж. Ошибка, которую я получил, это то, что я возвращаю пустой/неназначенный кортеж, который я понимаю, почему на основании того, где я его вернул, но я не уверен, как это исправить. Как создать этот кортеж с помощью правых петель и т. Д.? Заранее спасибо.

+0

Ваш код не компилируется, пожалуйста, исправить. Я предполагаю, что вы хотите перебирать 'addressBook' и' usersAndManagersList', а не над значениями «Значения» и «Ключи» каждого из них, а также, что вы хотите сделать 'if (thing.Value == that.Key)', но Я не знаю точно. Кроме того, попробуйте использовать лучшие имена переменных, чем 'thing' и' that'. – Quantic

+0

Вы должны просто взять адресную книгу и присоединиться к ней в userAndManagersList, а затем просто выбрать тупочку в селекторе результатов. –

+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

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

}

Смежные вопросы