Linq-запрос для объединения со списком в структуре

У меня есть словарь структуры, где один элемент представляет собой список, содержащий различные элементы, применимые к каждому элементу словаря.

Я хотел бы объединить эти элементы с каждым элементом, чтобы отфильтровать их и/или сгруппировать по элементам.

В SQL я знаком с объединением таблиц/запросов для получения нескольких строк по желанию, но я новичок в C#/Linq. Поскольку «столбец» может быть объектом/списком, уже связанным с соответствующими элементами словаря, интересно, как я могу использовать их для выполнения соединения?

Вот пример структуры:

name   elements
item1  list: elementA
item2  list: elementA, elementB

Мне нужен запрос, который дает этот вывод (count = 3)

name   elements
item1  elementA
item2  elementA
item2  elementB

В конечном счете, сгруппировав их следующим образом:

   element    count
   ElementA   2
   ElementB   1

Вот мой код начинает подсчет элементов словаря.

    public struct MyStruct
    {
        public string name;
        public List<string> elements;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        MyStruct myStruct = new MyStruct();
        Dictionary<String, MyStruct> dict = new Dictionary<string, MyStruct>();

        // Populate 2 items
        myStruct.name = "item1";
        myStruct.elements = new List<string>();
        myStruct.elements.Add("elementA");
        dict.Add(myStruct.name, myStruct);

        myStruct.name = "item2";
        myStruct.elements = new List<string>();
        myStruct.elements.Add("elementA");
        myStruct.elements.Add("elementB");
        dict.Add(myStruct.name, myStruct);


        var q = from t in dict
                select t;

        MessageBox.Show(q.Count().ToString()); // Returns 2
    }

Редактировать: мне не нужен вывод в виде словаря. Я использовал его для хранения своих данных, потому что он хорошо работает и предотвращает дублирование (у меня есть уникальное имя элемента, которое я храню как ключ). Однако с целью фильтрации/группировки я думаю, что это может быть список или массив без проблем. Я всегда могу сделать .ToDictionary, где key = item.Name впоследствии.

5
задан mtone 29 February 2012 в 07:00
поделиться