2014-12-23 166 views
0

我看到类似下面的帖子,这对我来说很难理解。所以我重新发布它。对不起,如果有人觉得它是重复的。我只是简单的要求将合并列表合并为一个

C# Joins/Where with Linq and Lambda

我有这样

public class Person 
{ 
    public int Id{get;set;} 
    public string Name{get;set;} 
    public string MailingAddress{get;set;} 
} 

一类我有这样的方法如下

public IList<Person> GetNames(IList<int> ids) 

这会给我列举的人员像下面

1“Sam”“”

2 “开发” “”

4 “Hummy”

我喜欢另一种方法如下

public IList<Person> GetMailingAddress(IList<int> ids) 

这会给我列举的人员像下面

1 “” “ABC”

6“”“TTT”

2“”“XYZ”

现在我需要合并的两种方法的结果,这样我可以有我这样的

1“山姆”,“ABC”

2“开发”最终结果“ XYZ“

更新:对不起,我没有明确给出我的测试数据。请参阅上面我的测试数据

+0

如果您有两个相关长度相同的列表以及要合并到单个列表中的相关索引,那么您要查找的操作是['Zip'](http://msdn.microsoft.com/zh-cn/ -us /库/ dd267698(v = vs.110)的.aspx)。对于更复杂的“关联”,您应该使用['Join'](http://msdn.microsoft.com/zh-cn/library/bb534675(v = vs.110).aspx),您可以在其中定义构成一场比赛。这些都不是合并,因为它们不会修改最初的集合,它们是*投射到新的集合中。 –

+0

不幸的是,从你的问题来看,你没有完全清楚你想要做什么。为什么你有两种不同的方法根据ID值返回'Person'对象?你正在处理两个不同的基础数据表或什么?创建一种在单个操作中填充所有类字段的方法会更实际吗?是否有可能你会传递不同的'ids'列表到每个方法?只要在这两种情况下总是以相同顺序返回完全相同的ID的对象,'Zip'方法可以提供帮助。 –

+0

@Preston - 我无法使用Zip,因为我的两个列表长度不一样。我用join来解决我的问题。请看下面 – Ziggler

回答

5

我对你的方法返回的结果有些困惑,如果你需要结合两个结果来得到完整的对象,那么有两种方法可以使事情正常工作。

  1. 如果你可以依靠的同样数量的相同顺序返回的对象,你可以尝试:

    names.Zip(mailingAddresses, (n, m) => new Person 
    { 
        Id = n.Id, 
        Name = n.Name, 
        MailingAddress = m.MailingAddress 
    }); 
    
  2. 如果你不能依靠这两方面的条件下,可以使用Join

    names.Join(mailingAddresses, n => n.Id, m => m.Id, (n, m) => new Person 
    { 
        Id = n.Id, 
        Name = n.Name, 
        MailingAddress = m.MailingAddress 
    }); 
    

即使你有这些两个选项,有一个第三和BETT呃选项,如果你能控制实际从数据源获取对象的代码。如果你知道你需要这两部分数据,你应该创建一个方法来一次查询数据源来获取所有数据,而不是每个数据查询一次。

+0

请先看清楚第一个方法返回我的Id和名称对象第二个给我Id和MailingAddress 。获得两个结果后,我需要合并它们以获得Id,Name和MailingAddress。 – Ziggler

+0

@Ziggler这就是他的代码所做的。 –

+0

@Preston Guillot - 我在代码发布之前写了该评论。将研究它。 – Ziggler

1

Enumerable.Zip肯定会解决您的问题。

+0

我尝试使用Zip如下但不工作。我创建了像1,“Sam”和2,“Dev”这样的名字。我创建了地址1,“ABC”和4,“XYZ”。我使用Zip,但我得到它作为1,“山姆”,“ABC:(这是正确的)和2,”开发“,”XYZ“这是错误的我无法发布我的Zip查询,但我用了一个上面的Mitja S – Ziggler

+0

Zip没有工作,但Justin的选项2加入上面为我工作 – Ziggler

+0

我不知道这是如何得到3票这一个显然没有解决我的问题 – Ziggler

0

你可以用Enumerable.Zip解决它和之前订货数据:

IEnumerable<Person> list = GetNames(new List<int>()).OrderBy(p => p.Id).Zip(GetMainlingAddress(new List<int>()).OrderBy(p => p.Id), (first, second) => { return new Person() { Id = first.Id, Name = first.Name, MailingAddress = second.MailingAddress }; }); 
+0

我创建了名称,如1,“Sam”和2,“Dev”。我创建了地址1,“ABC”和4,“XYZ”。我使用Zip,但我得到它作为1,“山姆”,“ABC:(这是正确的)和2,”开发“,”XYZ“这是错误的我无法发布我的Zip查询,但我用了一个由Mitja S上面。 – Ziggler

0

执行JOIN在这两种方法的拉姆达风格的LINQ语法返回值:

var query = GetNames().Join(GetMailingAddress(), 
            n => n.Id, 
            e => e.Id, 
            (n, e) => new { n.Id,n.Name,e.Email}); 

     foreach (var item in query) 
     { 
      Console.WriteLine(item.Id + "-" + item.Name +"-"+ item.Email); 
     } 

执行JOIN在这两种方法通过Sql风格的Linq语法返回值:

var query = from n in GetNames() 
      join e in GetMailingAddress() 
      on n.Id equals e.Id 
      select new {n.Id,n.Name,e.Email }; 
foreach (var item in query) 
    { 
     Console.WriteLine(item.Id + "-" + item.Name +"-"+ item.Email); 
    } 

注意:GetName()和GetMailingAddress()方法返回结果集的列表。