首页 > 解决方案 > 基于接口实现的 LINQ 连接

问题描述

假设我有一个接口,它基本上是两个子接口的组合。这背后的想法是,我有两个不同的 API。提供有关个人的公共信息的一种。并且一旦提供“秘密”信息。它可能看起来像这样:

public interface IPublicPersonData
{
    // The ID is the key
    int PersonId { get; set; }

    // This property is specific to this part
    string Name {get; set; }
}

public interface ISecretPersonData
{
    // The ID is the key
    int PersonId { get; set; }

    // This property is specific to this part
    decimal AnnualSalary{ get; set; }
}

public interface IPerson: IPublicPersonData, ISecretPersonData
{
    // No new stuff, this is merely a combination of the two. 
}

所以基本上我得到了两个列表。一个List<IPublicPersonData>和一个List<ISecretPersonData>。我想将这些加入一个单一的List<IPerson>,理想情况下使用 LINQ。

我真的找不到任何关于如何根据输入类型控制 LINQ 输出类型的信息,即使存在逻辑(以实现接口的接口的方式)。

public List<IPerson> JoinPersonData(
    List<IPublicPersonData> publicData, 
    List<ISecretPersonData> secretData)
{
    // What the heck goes here?
}

标签: c#linqinterface

解决方案


假设您编写了一个方法,例如:

public ISomething CombinePersonWithSecret(
    IPublicPersonData publicPerson, 
    ISecretPersonData secret)
{
    if(publicPerson.PersonId != secret.PersonId)
    {
        throw ...;
    }
    //join 2 params into a single entity
    return something;
}

现在你可能...

IEnumerable<ISomething> secretivePeople = PublicPeople.Join(
    SecretPersonData,
    publicPerson => publicPerson.PersonId,
    secret => secret.PersonId,
    (publicPerson, secret) => CombinePersonWithSecret(publicPerson, secret))

推荐阅读