C# 怎么将两个List 拼成一个list的方法

有如下people pets 两个List

 Person magnus = new Person { Name = "Hedlund, Magnus" id=1};
 Person terry = new Person { Name = "Adams, Terry" ,id=2};
 Person charlotte = new Person { Name = "Weiss, Charlotte",id=3 };

 Pet barley = new Pet { Name = "Barley", ownerid = 1};
 Pet boots = new Pet { Name = "Boots", ownerid = 1 };
 Pet whiskers = new Pet { Name = "Whiskers", ownerid = 3 };
 Pet daisy = new Pet { Name = "Daisy", ownerid = 3};

 List<Person> people = new List<Person> { magnus, terry, charlotte };
 List<Pet> pets = new List<Pet> { barley, boots, whiskers, daisy };

怎么获得如下结果

[{Name : "Hedlund, Magnus" id:1,Pets:[{Name : "Barley"},{Name : "Boots"}]}
,{Name:"Adams, Terry",id:2 ,Pets:[]}
,{Name :"Weiss, Charlotte",id:"3",Pets:[{Name :"Whiskers"},{Name :"Daisy"}]}]

我想利用Enumerable 的join 或是groupby的都不大熟悉。写了半天也没的出来,求一个了解c#的帮解一下
问题追加:
我已经创建了一个class


public class family{
[DataMember]
public string name;
[DataMember]
public int id ;
[DataMember]
public List<Pet> pets;
}

用foreach 去分别遍历 pets 和people 这个方法也可以实现。我感觉可能不是那么优。
所以我想了解 Enumerable有没有哪个方法或是几个方法组合可以做到如此。

实际情况是我从sqlserver中的存储过程返回了类似于people和pets的两个表。我现在需要拼成上文的family 的list结果作为webservice的jsonp数组返回(上面的结果是我前端页面接收的json数据)。

阅读 19.2k
5 个回答

使用 foreachSystem.Linq 可以很方便的处理,使用 Newtonsoft Json.NET 可以很好的输出 JSON。

using System;
using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json;

namespace ConsoleApplication2
{
    class Program
    {
        class Person
        {
            public string Name { get; set; }
            public int Id { get; set; }
            public Pet[] Pets { get; set; }
        }

        class Pet
        {
            public string Name { get; set; }
            public int OwenerId { get; set; }
        }

        public static void Main()
        {
            Person magnus = new Person { Name = "Hedlund, Magnus", Id = 1 };
            Person terry = new Person { Name = "Adams, Terry", Id = 2 };
            Person charlotte = new Person { Name = "Weiss, Charlotte", Id = 3 };

            Pet barley = new Pet { Name = "Barley", OwenerId = 1 };
            Pet boots = new Pet { Name = "Boots", OwenerId = 1 };
            Pet whiskers = new Pet { Name = "Whiskers", OwenerId = 3 };
            Pet daisy = new Pet { Name = "Daisy", OwenerId = 3 };

            List<Person> people = new List<Person> { magnus, terry, charlotte };
            List<Pet> pets = new List<Pet> { barley, boots, whiskers, daisy };

            foreach (var p in people)
            {
                p.Pets = pets.Where(pet => pet.OwenerId == p.Id).ToArray();
            }

            var json = JsonConvert.SerializeObject(people);
            Console.WriteLine(json);
        }
    }
}

输出(为了好看我格式化了的,实际输出是一行)

[{
    "Name": "Hedlund, Magnus",
    "Id": 1,
    "Pets": [{
        "Name": "Barley",
        "OwenerId": 1
    }, {
        "Name": "Boots",
        "OwenerId": 1
    }]
}, {
    "Name": "Adams, Terry",
    "Id": 2,
    "Pets": []
}, {
    "Name": "Weiss, Charlotte",
    "Id": 3,
    "Pets": [{
        "Name": "Whiskers",
        "OwenerId": 3
    }, {
        "Name": "Daisy",
        "OwenerId": 3
    }]
}]

也可以在程序里格式化,给 Json.NET 加配置就可以了,这个可以查文档,就不细说了。

var list1 = new List<int>();
var list2 = new List<string>();
var list = new System.Collections.ArrayList(list1);
list.AddRange(list2);

不能直接拼,你需要构建一个新的Class才行,如PersonAndPet,这个Class的成员变量有Name,id,Pets。然后自己写一个方法来拼,返回一个List<PersonAndPet>对象
可以这么写:

Class PersonAndPet {

public string Name {get;set;}
public int id {get;set;}
public List<Pet> Pets {get;set;}

......

}

//方法一,用自己的算法来合并List
public List<PersonAndPet> Merge(IEnumerable<Person> person, IEnumerable<Pet> pet)
{
  ......
}

//方法二,逐项添加的办法得到List
public void Add(ref List<PersonAndPet> result, Person person, IEnumerable<Pet> pet)
{
  ......
}

bhysyq说的没错,你解析后就是Json格式

List<object>
Add
JsonConvert.SerilizeObject

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进