2016-06-01 12 views
0

構造体クライアントとクライアントのリストがあります。構造体のリストに要素が含まれているかどうか確認してください

struct Client 
     { 
      public IPEndPoint endpoint; 
      public string ClientName; 
     } 
List<Client> clientList = new List<Client>(); 

リストに特定の名前のクライアントが含まれているかどうかを確認するにはどうすればよいですか?私はそのようにしようとしました

if(clientList.Find(Client => Client.ClientName == userNickname) 

しかし、残念なことにブール値を返しません。

+0

「それはbool値を返さない」とは何ですか?これは、コンパイラエラーまたはランタイム例外を表示しますか?そのエラーテキストに関するあなたの調査は何をあなたに与えましたか?つまり、 'Find()'が何を返し、 'if()'が欲しいのですか?あなたは正確に何を試そうとしていますか? – CodeCaster

+0

グーグルのほんの一瞬で私たちは大量の複製になります... – HimBromBeere

+0

特定の名前のクライアントが私のリストに存在するかどうかを確認したいと思いました。 Find()演算子はClientオブジェクト全体を返し、私のコンパイラはif文の中でそれを使用させません。 私はそれをグーグルで見つけました、私は誓います。私は複数のソリューションを試しましたが、何とかAny()演算子を見落とさなくてはならないと思います –

答えて

5

あなたは、LINQのAny()メソッドを使用することができます。

bool contains = clientList.Any(client => client.ClientName == userNickname); 

AnyClientのインスタンスを返すFind()Find()ためよりも、この場合は簡単です。さらに比較する必要があります(default(Client)のように、Jodrellが提案した、または再度名前を比較してください)。

+0

エラーが発生したためContainsを使用できません "ラムダ式をデリゲート型ではないため 'Program.Client'と変換できません。しかし、「Any」は完璧に動作します:)ありがとう。 –

0

えーと、

if (clientList.Find(Client => Client.ClientName == userNickname).ClientName != userNickname) 
... 

あなたがList<T>.Findのドキュメントを読めば、あなたがリストのどの要素がpredicateのためにtrueを返すない場合Tのデフォルト値が返されることがわかります。

nullという名前のClientを検索する場合は、明らかにこれは機能しません。

使い方はややこしいので、構造体ではうまく機能しません。 ClientClientのクラスまたはオーバーライドの同等化にするか、またはClientを不変にするか、他の処理を行うことを検討してください。

関連する問題