LINQ返回分组为匿名类型的数据子集

时间:2014-06-19 02:50:34

标签: c# linq

我有一个人员列表,我想使用LINQ(查询语法)来获取包含所有名字和所有第二名的匿名类型。

如果我要使用foreach:

var firstNames = new HashSet<string>();
var secondNames = new HashSet<string>();

foreach (Person p in ListOfPersons)
{
  firstNames.Add(p.firstName);
  secondNames.Add(p.secondName);
}

什么是返回匿名类型的等效且高效的LINQ语句?例如,allNames.FirstNames和allNames.SecondNames。

编辑:当我说效率时,我的意思是它在ListOfPersons上循环一次,如上面的foreach示例所示。

编辑2:名称应该是不同的;我更改了List&lt;&gt;到HashSet&lt;&gt;在foreach示例中

5 个答案:

答案 0 :(得分:2)

如果你不想迭代ListOfPersons两次,我在linq中看到它的唯一方法是

var firstNames = new List<string>();
var secondNames = new List<string>();

persons.Aggregate(Tuple.Create(firstNames, secondNames), (tuple, person) =>
{
    tuple.Item1.Add(person.firstName);
    tuple.Item2.Add(person.secondName);
    return tuple;
});

但我认为foreach要好得多。

答案 1 :(得分:1)

试试这个:

var AnonList = ListOfPersons.Select(x=> new {firstname = x.firstName, secondname = x.secondName});

答案 2 :(得分:0)

这个怎么样:

var allNames = new
{
    firstNames = new List<string>(),
    secondNames = new List<string>()
};

listOfPersons.ForEach( p => 
{
    allNames.firstNames.Add( p.firstName );
    allNames.secondNames.Add( p.secondName );
} );

答案 3 :(得分:0)

var nameList = from l in ListOfPersons
               select new { FirstName = l.Firstname, Surname = l.Surname};

答案 4 :(得分:0)

直观地说,这是最有效的:

var names = new
{
    firstNames = ListOfPersons.Select(x => x.firstName).Distinct().ToList(),
    secondNames = ListOfPersons.Select(x => x.secondName).Distinct().ToList(),
};

事实证明,对列表进行两次迭代更有效的方法是,一旦创建了更多的临时变量,就可以调用一个方法来迭代它。我已经对这类事情进行了速度测试,并在列表上多次迭代获胜。