Словарь <(строка, строка, строка), Список <object>> как получить значение, которое соответствует 1 ключу этого вида словаря - PullRequest
0 голосов
/ 11 февраля 2020

У меня есть словарь, в котором используется комбинация строки.

using System;
using System.Collections.Generic;
using System.Linq;

public class Program
{
    public static void Main()
    {
        List<People> listName = new List<People>(){
        new People(){firstname = "David", middlename = "Broom", lastname = "Lightning", value = 1},
        new People(){firstname = "Dave", middlename = "Cak", lastname = "Londo", value = 2},
        new People(){firstname = "Chris", middlename = "Vanglein", lastname = "Walls", value = 3},
        new People(){firstname = "Rudy", middlename = "Affair", lastname = "Master", value = 4}};

        Dictionary<(string, string, string), List<People>> data = listName
            .Where(x => x.value != 0)
            .GroupBy(x => (x.firstname, x.middlename, x.lastname))
            .ToDictionary(x => x.Key, x => x.ToList());
    }

    public class People {
        public string firstname {get; set;}
        public string middlename {get; set;}
        public string lastname {get; set;}
        public int value {get; set;}
    }
}

https://dotnetfiddle.net/dGTHv7

как получить значение, когда у меня только 2 ключа имени и фамилия.

Я хочу получить все, что совпадает с именем и фамилией и игнорировать middlename.

1 Ответ

1 голос
/ 11 февраля 2020

Нет смысла иметь словарь, в котором ключ является комбинацией этих 3-х данных, если вам нужно получить данные только с 2-мя данными.

Как насчет непосредственного анализа списка?

var matchingPeople = listName.Where(p => p.firstname == "myfirstname" && p.lastname == "mylastname");

РЕДАКТИРОВАНИЕ: Затем вам нужно сделать это:

var listName = new List<People>
{
    new People { firstname = "David", middlename = "Broom", lastname = "Lightning", value = 1 },
    new People { firstname = "Dave", middlename = "Cak", lastname = "Londo", value = 2 },
    new People { firstname = "Chris", middlename = "Vanglein", lastname = "Walls", value = 3 },
    new People { firstname = "Rudy", middlename = "Affair", lastname = "Master", value = 4 }
};

var data = listName
    .Where(x => x.value != 0)
    .GroupBy(x => (x.firstname, x.middlename, x.lastname))
    .ToDictionary(x => x.Key, x => x.ToList());

var myfirstname = "David";
var mylastname = "Broom";
var matchingPeople = data.Where(x => x.Key.firstname == myfirstname && x.Key.lastname == mylastname).SelectMany(x => x.Value);

Вам необходимо использовать .Where(...) для фильтрации данных и .Select(...), чтобы выбрать .Value часть словаря. Поскольку .Value является списком, результатом будет List из List, поэтому используйте .SelectMany вместо .Select, чтобы объединить эти List в один list.

...