C # - объединение двух LanguageExt либона соответствующий ключ - PullRequest
0 голосов
/ 19 сентября 2019

В приведенном ниже примере у меня есть два набора объектов с соответствующими ключами.

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<Error, List<T>>?

1 Ответ

1 голос
/ 19 сентября 2019
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 ...

...