Использование лямбда-выражения для извлечения Различного списка строк внутри списков в списках интерфейсов и т. Д. - PullRequest
0 голосов
/ 26 января 2012

Я пытаюсь выяснить, нужно ли изменить следующий код на лямбда, чтобы сделать его 1 - 2 строками ... Пожалуйста, помогите мне, если это возможно ... не совсем уверен, когда интерфейсы участвуют, как сделать Lambdas.

        // List of objects
        // with list of interfaces inside
        // with list of Strings inside each each interface type.

        List<MyObject> list = new List<MyObject>();
        MyObject mo = new MyObject();
        mo.Name = "Blah";
        MyAction action1 = new MyAction();
        action1.recipients.Add("email1");
        action1.recipients.Add("email2");
        action1.recipients.Add("email3");
        mo.Actions.Add(action1);
        MyAction2 action2 = new MyAction2();
        action2.recipients.Add("email1");
        action2.recipients.Add("email3");
        mo.Actions.Add(action2);
        MyAction3 action3 = new MyAction3();
        action3.recipients.Add("email2");
        action3.recipients.Add("email4");
        mo.Actions.Add(action3);
        list.Add(mo);

        List<string> resulting = new List<string>();
        foreach (MyObject o in list)
        {
            foreach (IAction i in o.Actions)
            {
                if (i.GetType().Name == "MyAction")
                {
                   MyAction a = (MyAction)i;
                   resulting.AddRange(a.recipients);
                }
                else if (i.GetType().Name == "MyAction2")
                {
                    MyAction2 a = (MyAction2)i;
                    resulting.AddRange(a.recipients);
                }
                else if (i.GetType().Name == "MyAction3")
                {
                    MyAction3 a = (MyAction3)i;
                    resulting.AddRange(a.recipients);
                }
            }
        }

        IEnumerable<string> done = resulting.Distinct();
        string[] sarr = done.ToArray();

1 Ответ

4 голосов
/ 26 января 2012

Предполагая, что ваш интерфейс IAction имеет свойство recipients, вы не нуждаетесь в приведениях - если нет, вы должны добавить это свойство к IAction. Тогда вы можете сделать

var sarr = list.SelectMany(o => o.Actions)
               .Select(x => x.recipients)
               .SelectMany(x => x)
               .Distinct()
               .ToArray()

(Кроме того, оно действительно должно быть написано с заглавной буквы Recipients, чтобы придерживаться правил именования для свойств).

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

var sarr = list.SelectMany(o => o.Actions.Select(x=> x.recipients))
               .SelectMany(x => x)
               .Distinct()
               .ToArray()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...