1

我仍在学习 C#,并正在尝试构建一个 NIC 列表,以后可以在我的代码中引用这些列表来执行 misc。功能。无论如何,我可以很好地填充列表,但现在的问题是我不确定在列表中搜索具有特定条件的 NIC 对象的最佳方法。我可以让 foreach 循环工作,但我不确定这是否是最好的方法。我已经搜索了这个主题,并找到了一堆关于如何使用 LINQ 或使用 Lambda 进行高级搜索的材料,但对于初学者来说,这些工作并没有任何好的信息。

这是我创建对象和列表的代码以及我想要完成的伪代码:

//Constructs a NIC structure and a list to store NICs (my actual code)
struct NIC
{
    public string nicName;
    public string nicIp;
    public string nicGateway;
    public string nicMask;
}
List<NIC> nicList = new List<NIC>();




//Example searches in semi pseudocode
if nicList contains any NIC where anyNIC.nicIp first three chars .Contains("169")
{
//Do something
}


if nicList contains any NIC where anyNIC.nicIP != null 
{
//Do something
}

-谢谢

4

4 回答 4

2

LINQ 即将成为您最好的朋友。在这种情况下,我会使用该Enumerable.Any方法。Enumerable.Any是一个扩展方法IEnumerable<T>,所以你可以直接在你的nicList. 您向它传递一个函数,该函数接受一个实例NIC并返回trueor false

这是在您的特定情况下的样子:

if (nicList.Any(x => x.nicIp.StartsWith("169"))
{
   // Do something
}


if (nicList.Any(x => !string.IsNullOrEmpty(x.nicIP))
{
   // Do something
}

在这种情况下,如果您有一个或多个满足您的条件的元素,则只Enumerable.Any返回。true如果要访问满足条件的元素,请使用 LINQ 方法Enumerable.Where。签名是相同的,但不是 a bool,而是返回一个IEnumerable<T>

例子:

var nicsWithIp = nicList.Where(x => !string.IsNullOrEmpty(x.nicIP);

有关更多信息,请查看此 MSDN 页面:“ C# 中的 LINQ 入门”。

于 2013-01-16T19:08:01.750 回答
0

使用 LINQ:

var nics = nicList.Where(n => n.nicIp.Substring(0, 3) == "169").ToList();
于 2013-01-16T19:08:44.803 回答
0

您有几种方法可以使用 LINQ 框架来解决这个问题。

您可以使用内联查询语法:

// Get all NICs with 169.x.x.x IP address
var nic169 = from nic in nicList
              where nic.nicIp != null && nic.nicIp.StartsWith("169")
              select nic;

var contains169Ip = nic169.Count() > 0;

// Get all NICs with non-null, non-empty IP address    
var validIpNics = from nic in nicList
                   where !string.IsNullOrWhiteSpace(nic.nicIp)
                   select nic;

或者,您可以将lambda 语法与 LINQ 方法一起使用:

// Do we have a 169.x.x.x NIC present?
var has169 = nicList.Any(nic => nic.nicIp != null && nic.nicIp.StartWith("169"));

// First NIC with a non-null, non-empty IP address
var firstNic = nicList.First(nic => !string.IsNullOrWhiteSpace(nic.nicIp));

为了更好地解释lambda表达式,请delegate采用Func<string,bool>. 这意味着“一种接受字符串并返回布尔值的方法”。该方法在.Any()方法中用作选择器来确定是否有任何对象匹配。

var func = (text) => { return !string.IsNullOrWhiteSpace(text); }

直接等价于:

bool OurLambdaFunc(string text) { return !string.IsNullOrWhiteSpace(text); }

.Any<T>(Func<T,bool> selector)方法扩展为如下内容:

public bool Any<T>(IEnumerable<T> collection, Func<T, bool> selector)
{
  foreach(var value in collection)
    if(selector(value))
      return true;  // Something matched the selector method's criteria.

  // Nothing matched our selector method's criteria.
  return false;
}
于 2013-01-16T19:31:44.340 回答
0

怎么样:

if(nicList.Where(n => n.nicIp.Substring(0, 3) == "169").Any())
{

}

if(nicList.Where(n => n.nicIp != null).Any())
{

}

明智的做法是在第一个检查中添加一个空检查,以防止出现 NullReferenceException:

if(nicList.Where(n => n.nicIp != null && n.nicIp.Substring(0, 3) == "169").Any())
{

}
于 2013-01-16T19:09:15.773 回答