Лямбда-выражение с двумя объектами - PullRequest
0 голосов
/ 01 февраля 2011

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

            foreach (var _systemItem in _systemData)
            {
                foreach (var _institutionItem in _institutionData)
                {
                    if (_systemItem.LookupValue == _institutionItem.OriginalSystemLookupValue)
                    {
                        _values.Add(new LookupValue()
                        {
                            DisplayText = _institutionItem.LookupText,
                            Value = _institutionItem.LookupValue
                        });
                    }
                    else
                    {
                        _values.Add(new LookupValue()
                        {
                            DisplayText = _systemItem.LookupText,
                            Value = _systemItem.LookupValue
                        });
                    }
                }
            }

Ответы [ 3 ]

4 голосов
/ 01 февраля 2011

Как это:

values.AddRange(from s in _systemData
                from i in institutionData
                select s.LookupValue == i.OriginalSystemLookupValue ?
                    new LookupValue {
                        DisplayText = _institutionItem.LookupText,
                        Value = _institutionItem.LookupValue
                    }
                :   new LookupValue {
                        DisplayText = _systemItem.LookupText,
                        Value = _systemItem.LookupValue
                    }
               );
3 голосов
/ 01 февраля 2011

Является ли _values List<LookupValue> пустым для начала?Если это так, этот внешний вид может выглядеть следующим образом:

_values = (from x in _systemData
           from y in _institutionData
           let item = x.LookupValue == y.OriginalSystemLookupValue ? x : y
           select new LookupValue { DisplayText = item.LookupText,
                                    Value = item.LookupValue })
          .ToList();

Это предполагает, что _systemItem и _institutionItem относятся к одному типу.Если они не связаны между собой, вы можете дать им общий интерфейс, который определяет LookupText и LookupValue (или даже метод ToLookupValue), а затем привести один из операндов в условном операторе к интерфейсу.Например:

_values = (from x in _systemData
           from y in _institutionData
           let item = x.LookupValue == y.OriginalSystemLookupValue
                      ? (ILookupSource) x : y
           select item.ToLookupValue())
          .ToList();
0 голосов
/ 01 февраля 2011

Конечно, у меня есть мнение. Я бы написал так:

var pairs = _systemData.SelectMany(s =>
    _institutionData.Select(i => new { System = s, Institution = i }));

_values.AddRange(pairs.Select(x =>
{
    bool match = x.System.LookupValue == x.Insitution.OriginalSystemLookupValue;

    return match ? new LookupValue(x.Institution) : new LookupValue(x.System);
}));

И переместите инициализаторы объектов для LookupValue в реальные конструкторы, которые принимают Institution или System.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...