使用 LINQ 将范围添加到列表框
Use LINQ for AddRange to Listbox
你好,我尝试使用 Linq 将我的旧代码转换为新版本,但我遇到了问题
旧:
foreach (var item in NetworkInterface.GetAllNetworkInterfaces())
{
if (item.NetworkInterfaceType == NetworkInterfaceType.Ethernet)
{
lstTrace.Items.Add(item.Name);
}
}
对此:
lstTrace.Items.Add(
NetworkInterface.GetAllNetworkInterfaces()
.Where(nic => nic.NetworkInterfaceType == NetworkInterfaceType.Ethernet)
.FirstOrDefault()
.Name
);
但它只是 returns 一个结果。
我怎样才能得到所有找到的物品?
lstTrace.Items.AddRange(NetworkInterface.GetAllNetworkInterfaces().Where(nic => nic.NetworkInterfaceType == NetworkInterfaceType.Ethernet).Select(a => a.Name).ToArray());
你只得到一个,因为你只要求一个:FirstOrDefault
会给你序列的第一个成员或类型的默认值,如果它空。
您需要做的是使用 Select
:
将序列投影到您真正需要的位置
lstTrace.Items
.AddRange(NetworkInterface.GetAllNetworkInterfaces()
.Where(nic => nic.NetworkInterfaceType == NetworkInterfaceType.Ethernet)
.Select(item => item.Name));
您需要使用 AddRange 方法来添加多个项目,然后您只需要使用 select 来获取您的 nic 的名称。
您当前的代码正在使用 FirstOrDefault
,它只会 return 来自您的可枚举的单个值(第一个)。
lstTrace.Items.AddRange(
NetworkInterface
.GetAllNetworkInterfaces()
.Where(nic => nic.NetworkInterfaceType == NetworkInterfaceType.Ethernet)
.Select(nic => nic.Name)
.ToArray()
);
此外,xanatos 对您的问题的评论值得在此重复。您以前的代码运行良好,并且可读。使用 LINQ 执行此操作不会使您的代码更快,而且我可能会说它更难阅读(如果有的话)。虽然上面的代码应该可以工作,但我会认真考虑只保留您的原始代码。
我不建议创建 'one-liner' 跨越 5 行并且混合了数据选择和填充列表视图的代码。让这两件事都易于阅读和理解。拆分 (1) 检索和过滤数据与 (2) 将数据分配给列表视图:
var ethernetInterfaceNames =
from i in NetworkInterface.GetAllNetworkInterfaces()
where i.NetworkInterfaceType == NetworkInterfaceType.Ethernet
select i.Name;
foreach(var name in ethernetInterfaceNames)
lstTrace.Items.Add(name);
我还将获取以太网接口名称移动到单独的方法或层。因此,您将拆分业务逻辑和表示逻辑。您可以在此处使用 AddRange
,但这不会使您的代码更简单:
lstTrace.Items.AddRange(ethernetInterfaceNames.Select(n => new ListViewItem(n)).ToArray())
我相信简单的 foreach 循环更具可读性。
这里有一个如何使用 AddRange 的例子
var projects = multi.Read<ProjectDto>();
var projectAct = multi.Read<ProjectActivity>();
foreach (var project in projects)
{
project.ProjectActivities = new List<ProjectActivity>();
project.ProjectActivities.AddRange(projectAct.Where(x => x.ProjectId == project.ProjectId));
}
注意:不能仅在数据类型列表中对数据类型 IEnumerable 使用 addrange。
你好,我尝试使用 Linq 将我的旧代码转换为新版本,但我遇到了问题 旧:
foreach (var item in NetworkInterface.GetAllNetworkInterfaces())
{
if (item.NetworkInterfaceType == NetworkInterfaceType.Ethernet)
{
lstTrace.Items.Add(item.Name);
}
}
对此:
lstTrace.Items.Add(
NetworkInterface.GetAllNetworkInterfaces()
.Where(nic => nic.NetworkInterfaceType == NetworkInterfaceType.Ethernet)
.FirstOrDefault()
.Name
);
但它只是 returns 一个结果。 我怎样才能得到所有找到的物品?
lstTrace.Items.AddRange(NetworkInterface.GetAllNetworkInterfaces().Where(nic => nic.NetworkInterfaceType == NetworkInterfaceType.Ethernet).Select(a => a.Name).ToArray());
你只得到一个,因为你只要求一个:FirstOrDefault
会给你序列的第一个成员或类型的默认值,如果它空。
您需要做的是使用 Select
:
lstTrace.Items
.AddRange(NetworkInterface.GetAllNetworkInterfaces()
.Where(nic => nic.NetworkInterfaceType == NetworkInterfaceType.Ethernet)
.Select(item => item.Name));
您需要使用 AddRange 方法来添加多个项目,然后您只需要使用 select 来获取您的 nic 的名称。
您当前的代码正在使用 FirstOrDefault
,它只会 return 来自您的可枚举的单个值(第一个)。
lstTrace.Items.AddRange(
NetworkInterface
.GetAllNetworkInterfaces()
.Where(nic => nic.NetworkInterfaceType == NetworkInterfaceType.Ethernet)
.Select(nic => nic.Name)
.ToArray()
);
此外,xanatos 对您的问题的评论值得在此重复。您以前的代码运行良好,并且可读。使用 LINQ 执行此操作不会使您的代码更快,而且我可能会说它更难阅读(如果有的话)。虽然上面的代码应该可以工作,但我会认真考虑只保留您的原始代码。
我不建议创建 'one-liner' 跨越 5 行并且混合了数据选择和填充列表视图的代码。让这两件事都易于阅读和理解。拆分 (1) 检索和过滤数据与 (2) 将数据分配给列表视图:
var ethernetInterfaceNames =
from i in NetworkInterface.GetAllNetworkInterfaces()
where i.NetworkInterfaceType == NetworkInterfaceType.Ethernet
select i.Name;
foreach(var name in ethernetInterfaceNames)
lstTrace.Items.Add(name);
我还将获取以太网接口名称移动到单独的方法或层。因此,您将拆分业务逻辑和表示逻辑。您可以在此处使用 AddRange
,但这不会使您的代码更简单:
lstTrace.Items.AddRange(ethernetInterfaceNames.Select(n => new ListViewItem(n)).ToArray())
我相信简单的 foreach 循环更具可读性。
这里有一个如何使用 AddRange 的例子
var projects = multi.Read<ProjectDto>();
var projectAct = multi.Read<ProjectActivity>();
foreach (var project in projects)
{
project.ProjectActivities = new List<ProjectActivity>();
project.ProjectActivities.AddRange(projectAct.Where(x => x.ProjectId == project.ProjectId));
}
注意:不能仅在数据类型列表中对数据类型 IEnumerable 使用 addrange。