Вы можете сделать это через ряд сцепленных запросов LINQ в следующем порядке:
GroupBy()
- Это будет создавать группы каждого из ваших индивидуальных пользователей, чтобы избежать проблем при создании словаря (а именно дублирующие ключи).
ToDictionary()
- Этот метод будет работать для привязки заданного набора данных с использованием ключа и значения, поскольку у вас уже есть свои ключи (через более ранний вызов), вам просто нужно получить свои значения из каждой группы.
SelectMany()
- Это позволит выбрать все индивидуальные значения из более ранних групп, по сути, объединить все элементы из каждого набора пользователей в одну коллекцию.
Distinct()
- Это будет применяться к списку строк, сгенерированных на предыдущем шаге, для удаления любых дубликатов. Если вы хотите разрешить дубликаты, просто удалите этот шаг.
Реализация этого будет выглядеть как следующий фрагмент кода:
// Group the collections by user and then select the keys based on those users
var dictionary = list.GroupBy(l => l.Key)
.ToDictionary(
x => x.Key,
x => x.SelectMany(l => l.Value)
.Distinct()
.ToList()
);
Пример
// Example of your existing data
var list = new List<KeyValuePair<string, List<string>>>(){
new KeyValuePair<string,List<string>>("User 1", new List<string>(){ "trigger1" ,"trigger2", "trigger3" }),
new KeyValuePair<string,List<string>>("User 2", new List<string>(){ "trigger1" ,"trigger2" }),
new KeyValuePair<string,List<string>>("User 3", new List<string>(){ "trigger2" ,"trigger3", "trigger4" }),
new KeyValuePair<string,List<string>>("User 1", new List<string>(){ "trigger0" ,"trigger4" }),
};
// Group the collections by user and then select the keys based on those users
var dictionary = list.GroupBy(l => l.Key)
.ToDictionary(
x => x.Key,
x => x.SelectMany(l => l.Value)
.Distinct()
.ToList()
);
// Output each key with it's associated values
foreach(var key in dictionary.Keys)
{
Console.WriteLine("Key: " + key + ", Values: " + String.Join(",",dictionary[key].ToArray()));
}
// Example output
// Key: User 1, Values: trigger1,trigger2,trigger3,trigger0,trigger4
// Key: User 2, Values: trigger1,trigger2
// Key: User 3, Values: trigger2,trigger3,trigger4
Вы можете see an interactive version of this here.
Выглядит хорошо, за исключением того, мне не нужно list1.Concat (песни2), так как у меня только 1 список. – FailedUnitTest
@FailedUnitTest Я думал, что ваши КВП происходят из разных источников. Благодаря! – dasblinkenlight