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

C# LINQ返回分组为匿名类型的数据子集,c#,linq,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.second

我有一个人员列表,我想使用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);
}
var firstNames=newhashset();
var secondNames=new HashSet();
foreach(人员列表中的人员p)
{
名字。添加(p.firstName);
secondName.Add(p.secondName);
}
返回匿名类型的等效有效LINQ语句是什么?例如,全名。名和全名。次名

编辑:当我说高效时,我的意思是它在人员列表上循环一次,如上面的foreach示例所示

编辑2:名称应该是不同的;在foreach示例中,我将列表更改为HashSet

var AnonList = ListOfPersons.Select(x=> new {firstname = x.firstName, secondname = x.secondName});
这个怎么样:

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

listOfPersons.ForEach( p => 
{
    allNames.firstNames.Add( p.firstName );
    allNames.secondNames.Add( p.secondName );
} );
var allNames=new
{
firstNames=新列表(),
secondNames=新列表()
};
ForEach(p=>
{
allNames.firstNames.Add(p.firstName);
allNames.secondNames.Add(p.secondName);
} );

如果您不想重复两次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;
});
var firstNames=新列表();
var secondNames=新列表();
persons.Aggregate(Tuple.Create(firstNames,secondNames),(Tuple,person)=>
{
tuple.Item1.Add(person.firstName);
tuple.Item2.Add(person.secondName);
返回元组;
});

但我认为foreach更好。

与直觉相反,这是最有效的:

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

事实证明,在列表上迭代两次比在创建了更多临时变量的情况下组合一个方法在列表上迭代更有效。我已经对这类东西进行了速度测试,并在列表中多次迭代获胜。

问题-如果您返回的是匿名类型,为什么需要两个变量,
firstNames
secondNames
?您是在所有名称之后还是仅仅是不同的名称?@Enigmativity很好,是的,不同的names@cyrus-然后,您的效率将超出迭代的窗口。使用Atomosk的解决方案,对来自真实世界数据库(已存入内存)的一些数据,我可以提取10.5ms的名称,但要使它们清晰,我还需要41.3ms。迭代原始源代码两次以生成不同的列表只需要48.3毫秒。这种情况下,迭代两次比一次好。这将比迭代两次慢得多。实际上,这并不慢。在这种情况下,它不会创建临时变量,因此速度更快。@神秘性取决于人是什么。并非每个
IEnumerable
都是
列表
。也许persons的
GetEnumerator()
执行一些非常复杂的逻辑。或者可能它会对两个不同的电话产生不同的结果。。。
var names = new
{
    firstNames = ListOfPersons.Select(x => x.firstName).Distinct().ToList(),
    secondNames = ListOfPersons.Select(x => x.secondName).Distinct().ToList(),
};