使用 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。