1

私はまだC#を学んでおり、後でコードで参照してその他を実行できるNICのリストを作成しようとしています。関数。とにかく、私はリストにうまく入力することができますが、問題は、特定の基準でNICオブジェクトをリストから検索するための最良の方法がわからないことです。foreachループを機能させることはできますが、これが最善のアプローチかどうかはわかりません。私はこのトピックを検索し、LINQまたはLambdasを使用して高度な検索を行う方法に関する多くの資料を見つけましたが、初心者のプログラマーにとってこれらの作業に関する良い情報は実際にはありません。

これが、オブジェクトとリストの作成に関する私のコードと、私が達成しようとしていることの擬似コードです。

//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を返す関数を渡します。truefalse

特定のケースでは、次のようになります。

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


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

この場合、条件を満たす要素が 1 つ以上ある場合にEnumerable.Anyのみ返されます。true条件を満たす要素にアクセスしたい場合は、LINQ メソッドを使用しますEnumerable.Where。シグネチャは同じですが、 の代わりに をbool返しますIEnumerable<T>

例:

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

詳細については、MSDN ページ「C# での LINQ の概要」を参照してください。

于 2013-01-16T19:08:01.750 に答える
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;

または、 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));

ラムダ式をよりよく説明するには、 のdelegate型を取りFunc<string,bool>ます。これは、「文字列を受け取り、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

LINQ を使用します。

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

どうですか:

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

}

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

}

NullReferenceException を防ぐために、最初のチェックにも null チェックを追加するのが賢明かもしれません。

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

}
于 2013-01-16T19:09:15.773 に答える