C# - 在匹配键上加入两个 LanguageExt Either<Error, List<T>>
C# - Joining two LanguageExt Either<Error, List<T>> on matching key
在下面的示例中,我有两组具有匹配键的对象。
class Stuff
{
int Key1 { get; set; }
... other props
}
class OtherStuff
{
int Key2 { get; set; }
... other props
}
我想将这些对象的两个列表连接在一起作为一对列表。假设有一个名为 Error
的 class 表示错误状态。我尝试通过以下方式进行;
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};
但这失败了
The name 's1' does not exist in the current context.
合并两个的最佳方法是什么Either<Error, List<T>>
?
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 都是 "right")。
我将您的 return 类型更改为元组以避免对象。你原来的例子就像
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
...
在下面的示例中,我有两组具有匹配键的对象。
class Stuff
{
int Key1 { get; set; }
... other props
}
class OtherStuff
{
int Key2 { get; set; }
... other props
}
我想将这些对象的两个列表连接在一起作为一对列表。假设有一个名为 Error
的 class 表示错误状态。我尝试通过以下方式进行;
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};
但这失败了
The name 's1' does not exist in the current context.
合并两个的最佳方法是什么Either<Error, List<T>>
?
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 都是 "right")。
我将您的 return 类型更改为元组以避免对象。你原来的例子就像
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
...