繁体   English   中英

使用C#LINQ连接已过滤的List <object> 列表 <string>

[英]Using C# LINQ to concat a filtered List<object> to List<string>

对于更熟练使用LINQ和C#中的Lambda表达式的人来说,这可能很容易。 我刚开始和他们在一起,所以我一定会错过一些东西。

我有一个这样的自定义对象:

public class BusinessName {
    public string Name { get; set; }
    public string Type { get; set; }
}

然后,我有一个这些对象的列表:

List<BusinessName> businessNames = new List<BusinessName>();

我想将此转换为具有BusinessName对象的Name属性的string列表:

List<string> names = new List<string>();

显然,我可以这样做:

foreach (BusinessName name in businessNames) {
    names.Add(name.Name);
}

但是,我想尝试在LINQ中使用lambda表达式,这样我就可以把它放到一个衬里中。

所以,我尝试过:

names.AddRange(businessNames.Select(item => item.Name));

这按预期工作,但比foreach循环慢2倍。 我怀疑这是因为它正在迭代列表两次,与foreach循环不同。

所以,我开始寻找替代方案。 我找到了Concat()但无法弄清楚它与AddRange()区别。

有没有人知道在LINQ的一次通过中做到这一点的方法?

如果names为空,那么您打算做的是:

var names = businessNames.Select(item => item.Name).ToList();

另一种选择是使用List<T>ConvertAll方法,如下所示:

var names = buisnessNames.ConvertAll(item => item.Name);

但是,如果它可能不为空,那么您还需要使用if语句:

var names = new List<string>();
//some code
if (names.Any())
    names.AddRange(/*your selected method*/);
else
    names = //your selected method;

因为businessNames是List,所以可以使用List.ForEach:

businessNames.ForEach(bn => names.Add(bn.Name));

您可以尝试通过在循环之前手动扩展List<string>容量来使foreach解决方案更快一些:

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>容量设置为所需的项目数。

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();
}
List<string> names = (from b in buisnessNames select b.Name).ToList();

或类似的东西...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM