使用LINQ for AddRange到Listbox

时间:2017-03-07 11:24:17

标签: c# winforms linq network-interface

您好我尝试将我的旧代码转换为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
);

但它只返回一个结果。 我如何获得所有找到的物品?

5 个答案:

答案 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。