C# 具有两个对象的Lambda表达式

C# 具有两个对象的Lambda表达式,c#,lambda,C#,Lambda,我知道这可以用lambda表达式重写。但我似乎无法理解。有人对如何使用lambda编写它有意见吗 foreach (var _systemItem in _systemData) { foreach (var _institutionItem in _institutionData) { if (_systemItem.LookupValue =

我知道这可以用lambda表达式重写。但我似乎无法理解。有人对如何使用lambda编写它有意见吗

            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
                        });
                    }
                }
            }
像这样:

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
                    }
               );
_值是一个开始为空的列表吗?如果是这样的话,看起来可能是这样的:

_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();
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);
}));
假设_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();

当然,我有一个意见。我会这样写:

_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();
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的对象初始值设定项移动到接受机构或系统的实际构造函数中。

您的代码实际上是在创建一个值列表,其中包含系统和机构列表的叉积。因此,如果systemData包含5个元素,而institutionData包含10个元素,那么values列表将以50个元素结束。这真的是你想要的吗?不,我不是。基本上如果我有一个包含所有50个州的系统列表。例如,一个机构想要用所有大写字母拼写阿拉斯加。我想让阿拉斯加取代阿拉克萨。因此,我们仍然有50项,但其中一项取代了另一项。我在数据库中有一个字段,用于存储我进行比较的原始值。如果有匹配项,则采用机构而不是系统。希望这有意义。我不会假设这些类型相同。我同意,这似乎不太可能。这太有道理了。@SLaks:我编辑的目的是要提到:如果它们不是同一类型,我认为将它们的共同点封装在一个接口中是值得的。@gevjen:你能按照我的建议为它们设置一个共同的接口吗?我不知道这些信息是否有用,但我使用的是EF和RiaService。这段代码被放入一个实现ILookupService的类中。我通过对这些实体的两次调用来填充这两个对象。系统信息填充系统对象,反之亦然。例如,如果我有一个州查找组,所有50个州都作为值,例如一个机构想要华盛顿就像华盛顿一样,我们将使用机构实体的华盛顿而不是系统实体的华盛顿。所以我希望我不必创建其他接口。除非这是我唯一的选择。谢谢帮助!经过一点修补后,这一切都很顺利。谢谢你的帮助。