Как получить значение из словарей в c# - PullRequest
1 голос
/ 25 февраля 2020
static void Main(string[] args)
{
    List<People> people = new List<People>(){
        new People(){FirstName = "aaa", LastName = "zzz", Age = 3, Location = "Berlin"},
        new People(){FirstName = "aaa", LastName = "yyy", Age = 6, Location = "Paris"},
        new People(){FirstName = "bbb", LastName = "zzz", Age = 5, Location = "Texas"},
        new People(){FirstName = "bbb", LastName = "yyy", Age = 4, Location = "Sydney"},
        new People(){FirstName = "ccc", LastName = "zzz", Age = 2, Location = "Berlin"},
        new People(){FirstName = "ccc", LastName = "yyy", Age = 3, Location = "New York"},
        new People(){FirstName = "aaa", LastName = "xxx", Age = 2, Location = "Dallas"},
        new People(){FirstName = "bbb", LastName = "www", Age = 6, Location = "DC"},
        new People(){FirstName = "ccc", LastName = "vvv", Age = 3, Location = "Detroit"},
        new People(){FirstName = "ddd", LastName = "uuu", Age = 5, Location = "Gotham"}
    };

    var dict = people
      .GroupBy(x => (x.FirstName, x.LastName))
      .ToDictionary(x => x.Key, 
                    x => x.ToList());

    /**
        how to get a value from dictionary when i just have first name.
        i want to get all value from dict where name = "aaa"
    **/
}

public class People
{
    public string FirstName {get; set;}
    public string LastName {get; set;}
    public int Age {get; set;}
    public string Location {get; set;}      
}

есть ли способ получить значение из словаря всего одним ключом (например, у меня просто есть имя "aaa", и я хочу получить всех людей с именем "aaa"). я могу получить его с помощью где, но нет смысла в использовании словаря. я должен использовать вложенный словарь или есть другой способ?

1 Ответ

0 голосов
/ 25 февраля 2020

Нет смысла использовать словарь, я не уверен, чего вы пытаетесь достичь, используя его? Почему бы просто не использовать список, как сказал mcjmzn?

List<people> peopleCohort = people.Where(p=> p.FirstName == "aaa").ToList();

Думаю, вы, возможно, задумывались над ним.

Stu.

ОБНОВЛЕНИЕ:

Учитывая следующий тест:

            SqlCommand com = new SqlCommand("SELECT Name FROM [Responses_PersonalData]", con);
        con.Open();
        List<Person> listPeople = new List<Person>();
        Dictionary<string, Person> dicPeople = new Dictionary<string, Person>();
        using (con)
        {
            Random rand = new Random();

            using (SqlDataReader reader = com.ExecuteReader())
            {
                if (reader.HasRows)
                {
                    while (reader.Read())
                    {
                        //Only use data where we have firstname, surname, approx 49,000 names in db.
                        string[] name = reader["Name"].ToString().Trim().Split(' ');
                        if (name.Length == 2)
                        {
                            Person person = new Person() { Age = rand.Next(0, 100), FirstName = name[0], LastName = name[1], Location = name[1] };
                            listPeople.Add(person);
                        }
                    }
                }
            }
        }

        //Creates approx 100 million people exponentially.
        for (int i = 1; i < 12; i++)
            listPeople.AddRange(listPeople);

        //Group by firstname lastname tuple
        var tuppleDicPeople = listPeople
            .GroupBy(x => (x.FirstName, x.LastName))
            .ToDictionary(x => x.Key,
                x => x.ToList());

        //Method 1
        List<Person> listPeopleCohortResults = listPeople.FindAll(p => p.FirstName == "Dean");
        //Method 2
        List<Person> dicPeopleCohortResults = tuppleDicPeople.Where(kvp => kvp.Key.FirstName == "Dean").SelectMany(kvp => kvp.Value).ToList();

Выводы:

Группировка по операции очень дорога.

listPeople.FindAll (p => p.FirstName == "Dean") ; => 1651мс, возвращает 32768 результатов.

Список dicPeopleCohortResults = tuppleDicPeople.Where (kvp => kvp.Key.FirstName == "Декан"). SelectMany (kvp => kvp.Value) .ToList (); => 10 мс , возвращает результаты 32768.

Если вы можете позволить себе расходы группы, то ваше решение будет оптимальным, учитывая ограниченное исследование, которое я провел.

Стю.

...