对于更熟练使用LINQ和C#中的Lambda表达式的人来说,这可能很容易。我刚开始和他们在一起,所以我一定会错过一些东西。
我有一个像这样的自定义对象:
public class BusinessName {
public string Name { get; set; }
public string Type { get; set; }
}
然后,我有一个这些对象的列表:
List<BusinessName> businessNames = new List<BusinessName>();
我想将此转换为string
的列表,其中包含Name
对象的BusinessName
属性:
List<string> names = new List<string>();
显然,我可以这样做:
foreach (BusinessName name in businessNames) {
names.Add(name.Name);
}
但是,我想尝试将LINQ表达式与LINQ一起使用,这样我就可以把它放到一个衬里中。
所以,我试过了:
names.AddRange(businessNames.Select(item => item.Name));
这可以按预期工作,但比foreach循环慢2倍。我怀疑这是因为它正在迭代列表两次,与foreach循环不同。
所以,我开始寻找另一种选择。我找到了Concat()
,但无法弄清楚它与AddRange()
有什么不同。
有没有人知道在LINQ的一次传递中做到这一点的方法?
答案 0 :(得分:1)
如果names
为空,那么您打算这样做:
var names = businessNames.Select(item => item.Name).ToList();
另一个选择是使用List<T>
的{{1}}方法,如下所示:
ConvertAll
但是,如果它可能不是空的,你也需要使用if语句:
var names = buisnessNames.ConvertAll(item => item.Name);
答案 1 :(得分:1)
因为businessNames是List,所以可以使用List.ForEach:
businessNames.ForEach(bn => names.Add(bn.Name));
答案 2 :(得分:1)
您可以尝试通过在循环之前手动展开foreach
容量来更快地使List<string>
解决方案:
var newList = new List<string>(names.Count + businessNames.Count);
newList.AddRange(names); // will perform `Array.Copy` on underlying array //
foreach (BusinessName name in businessNames) {
newList.Add(name.Name);
}
names = newList; // replace old list with a new one //
当您调用Add
时,会执行检查,以确保底层数组足够大以包含一个元素。如果不是,则通过创建新的,复制所有值并替换它来扩展它。当您添加大量项目时,它可能会多次发生。可以更快地帮助并将初始List<string>
容量设置为所需数量的项目。
答案 3 :(得分:1)
public class BusinessName {
public string Name { get; set; }
public string Type { get; set; }
}
void Main()
{
List<BusinessName> businessNames = new List<BusinessName>();
List<string> names = new List<string>();
names=names.Concat(businessNames.Select(b=>b.Name)).ToList();
}
答案 4 :(得分:0)
List<string> names = (from b in buisnessNames select b.Name).ToList();
或类似的......