2017-05-23 17 views
0

私は仕事のためのプログラムを書いています。初期化すると、if/else文の一連の処理が行われ、一致するものを見つけると、建物の場所が自分のフォームのラベルに印刷されます。ホスト名に文字列が含まれていて、配列リストがチェックされている場合

20 + if/elseステートメントの代わりに配列リストを使用してこのプロセスを最適化したいと思っています。問題が発生しています。ここでは以下のコードされています

string hostName = Environment.MachineName; 
string[] buildingCode = {"B1","B2","B3","B4"}; 
string[] buildingName = {"Building 1", "Building 2", "Building 3", "Building 4"}; 

if (hostName.Contains(buildingCode)) 
{ 
    Console.Write(buildingName); 
} 
else 
{ 
    Console.Write("Error!"); 
} 

私はそれが仕事をしたい方法は、それがbuildingCode配列から文字列値が含まれているかどうかを確認するために、コンピュータのhostnameをチェックすることです。その後、一致が見つかると、配列buildingNameの文字列値が使用されます。しかし、エラーリストは、このエラーが表示されます。

CS1503 Argument 1: cannot convert from 'string[]' to 'string'

は、私はまだC#のでコーディングでのわずかなnoobのですが、私はこの言語を使用して、私が助けを求めて回避しようとして、私は多くのことを学んでいますが、私は思います困った。どんなフィードバック/入力も事前に感謝します。すべての

+0

if (hostName.Contains(buildingCode))のを確認する必要があります配列ではなく文字列 –

+0

エラーは 'if(hostName.Contains(buildingCode))'で発生しています - buildingCode文字列変数の下に赤い行があります。 – mrdrumboy21

+0

hostnameの値は何ですか、自分自身のコードに自分自身のコードを表示します –

答えて

0

まずあなたが平均だ文字列

String[] = string Array

に文字列配列を比較するカント:

 string hostName = Environment.MachineName; 
      string[] buildingCode = {"B1","B2","B3","B4"}; 
      string[] buildingName = {"Building 1", "Building 2", "Building 3", "Building 4"}; 

      if (hostName.Contains(buildingCode[0])) 
      { 
       Console.Write(buildingName[0]); 
      } 
      else 
      { 
       Console.Write("Error!"); 
      } 

あなたが必要な場合があります:あなたのコードで

buildingCode[0] = B1; 

buildingCode[1] = B2; 

buildingCode[3] = B3; 

buildingCode[4] = B4; 

はこのようなものになりますすべての配列をチェックするループに入れる

0

if(stringに配列が含まれています)を書くことはできませんif内にfor-loopが必要です。 このように:

for (int i = 0; i <= stringname.length; i++) 
     { 
      if (string.Contains(stringname[i])) 
      { 
       Console.WriteLine(buildingName[i]); 
       //Do something 
      } 
     } 
0

以下を確認してください。 Array.ExistshostNamebuildingCodeに存在するかどうかをチェックします。 Array.IndexOfは一致のindexを与えてくれるので、インデックスに基づいてbuildingNameを得ることができます。

コード:

using System; 

public class Program 
{ 
    public static void Main() 
    { 
     string hostName = "B1"; 
     string[] buildingCode = {"B1","B2","B3","B4"}; 
     string[] buildingName = {"Building 1", "Building 2", "Building 3", "Building 4"}; 

     if (Array.Exists(buildingCode, element => element == hostName)) 
     { 
      Console.Write(buildingName[Array.IndexOf(buildingCode, hostName)]); 
     } 
     else 
     { 
      Console.Write("Error!"); 
     } 
    } 
} 

DotNetFiddleで出力を確認してください。

0

2つの異なる型を比較しています。Containsメソッドは、文字列の配列ではなく単一の文字列を取得します。あなたのコードはここで見つける

string hostName = Environment.MachineName; 
     string[] buildingCode = { "B1", "B2", "B3", "B4" }; 
     string[] buildingName = { "Building 1", "Building 2", "Building 3", "Building 4" }; 
    if (buildingCode.Where(t => t.Contains(hostname)).Any()) 
    { 
      Console.Write(buildingName[ 
      Array.IndexOf(buildingCode,buildingCode.Where(t => t.Contains(hostname)) 
     .FirstOrDefault())]); 
    } 

として次のようになります。あなたはおそらく混乱を引き起こしている間違ったデータ構造を使用している ActualCode

2

。あなたの建築コードにホスト名が含まれている場合、そのコードに対応する建物名はどのように決定されますか?

代わりに、建物のコード/名前をキー/値として格納するDictionaryを使用できます。

string hostName = "B1"; 

var buildings = new Dictionary<string, string> { 
    { "B1", "Building 1" }, 
    { "B2", "Building 2" }, 
    { "B3", "Building 3" }, 
    { "B4", "Building 4" } 
}; 

if (buildings.ContainsKey(hostName)) { 
    Console.Write(buildings[hostName]); 
} 
else { 
    Console.Write("Error!"); 
} 

P.S.これであなたの問題は解決しますが、実際にはMachineNameがどの建物に合っているか想像できません。

更新::OPはC#を学習しているので、ここでは彼が遊ぶためにfiddleがあります。

+0

辞書を使用すると、データが1か所に保持され、buildingNameとbuildingCodeの間に関係が作成されます。私はこの解決策を好む。 – Mickey

0

Contains機能でアレイ全体をチェックすることはできません。あなたがContains機能を使用したい場合は、配列の各要素

使用if (buildingCode.Any(x => x.Contains(hostName)))代わりにあなたは配列を印刷しようとしているともあなたは、配列を検証しようとしている内の条件ならば、それがあるべき