您好我尝试将我的旧代码转换为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
);
但它只返回一个结果。 我如何获得所有找到的物品?
答案 0 :(得分:1)
lstTrace.Items.AddRange(NetworkInterface.GetAllNetworkInterfaces().Where(nic => nic.NetworkInterfaceType == NetworkInterfaceType.Ethernet).Select(a => a.Name).ToArray());
答案 1 :(得分:1)
您需要使用AddRange方法添加多个项目,然后您只需使用select来获取您的网址名称。
您当前的代码正在使用FirstOrDefault
,它只会从您的枚举中返回一个值(第一个)。
lstTrace.Items.AddRange(
NetworkInterface
.GetAllNetworkInterfaces()
.Where(nic => nic.NetworkInterfaceType == NetworkInterfaceType.Ethernet)
.Select(nic => nic.Name)
.ToArray()
);
此外,xanatos对您的问题的评论值得在此重复。您以前的代码工作正常,并且可读。使用LINQ执行此操作并不会使您的代码更快,而且我可能会说如果有任何内容则更难以阅读。虽然上面的代码应该可行,但我会认真考虑保留原始代码。
答案 2 :(得分:1)
我不建议创建一个单行'代码跨越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循环更具可读性。
答案 3 :(得分:0)
你只得到一个,因为你只是要求一个:FirstOrDefault
会给你序列的第一个成员或类型的默认值,如果它是空的。
您需要做的是使用Select
将序列投射到您真正需要的地方:
lstTrace.Items
.AddRange(NetworkInterface.GetAllNetworkInterfaces()
.Where(nic => nic.NetworkInterfaceType == NetworkInterfaceType.Ethernet)
.Select(item => item.Name));
答案 4 :(得分:0)
以下是有关如何使用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。