我有一个人员列表,我想使用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示例中
答案 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(),
};
事实证明,对列表进行两次迭代更有效的方法是,一旦创建了更多的临时变量,就可以调用一个方法来迭代它。我已经对这类事情进行了速度测试,并在列表上多次迭代获胜。