【问题标题】:C# - Joining two LanguageExt Either<Error, List<T>> on matching keyC# - 在匹配键上加入两个 LanguageExt Either<Error, List<T>>
【发布时间】:2019-09-19 10:59:51
【问题描述】:

在下面的示例中,我有两组具有匹配键的对象。

class Stuff
{
    int Key1 { get; set; }
    ... other props
}

class OtherStuff
{
    int Key2 { get; set; }
    ... other props
}

我想将这些对象的两个列表连接在一起作为一对列表。假设有一个名为Error 的类表示错误状态。我尝试通过以下方式做到这一点;

Either<Error, List<Stuff>> eitherStuff = GetStuff();

Either<Error, List<OtherStuff>> eitherOtherStuff = GetOtherStuff();

Either<Error, List<object>> eitherCombined =
    from stuff in eitherStuff
    select stuff into s1
    from otherStuff in eitherOtherStuff
    select otherStuff into s2
    from s1item in s1
    join s2item in s2
    on s1item.Key1 equals s2item.Key2
    select new {s1item, s2item};

但这失败了

当前上下文中不存在名称“s1”。

结合两个Either&lt;Error, List&lt;T&gt;&gt; 的最佳方法是什么?

【问题讨论】:

    标签: c# linq monads language-ext


    【解决方案1】:
    Either<Error, List<(Stuff, OtherStuff)>> eitherCombined =
                    from stuff in eitherStuff
                    from otherStuff in eitherOtherStuff
                    select (from s1item in stuff
                            join s2item in otherStuff
                            on s1item.Key1 equals s2item.Key2
                            select (s1item, s2item)).ToList();
    

    外部 LINQ 表达式结合了两个 Either 元素。内部 LINQ 表达式连接列表(如果两者都“正确”)。

    我将您的返回类型更改为元组以避免对象。你原来的例子就像

    Either<Error, List<object>> eitherCombined =
                    from stuff in eitherStuff
                    from otherStuff in eitherOtherStuff
                    select (from s1item in stuff
                            join s2item in otherStuff
                            on s1item.Key1 equals s2item.Key2
                            select new {s1item, s2item} as object).ToList();
    

    你可以像这样使用你的匿名类型(没有不安全的object):

    var eitherCombined =
                    from stuff in eitherStuff
                    from otherStuff in eitherOtherStuff
                    select (from s1item in stuff
                            join s2item in otherStuff
                            on s1item.Key1 equals s2item.Key2
                            select new {s1item, s2item}).ToList();
    

    另一个提示:您可以使用 LanguageExt 不可变类型之一,而不是 List...

    【讨论】:

    • 太棒了!谢谢。这个 Monad 的东西在很大程度上仍然让我难以捉摸。
    猜你喜欢
    • 2020-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-23
    相关资源
    最近更新 更多