2011-05-04 134 views
1

我有一個數組,看起來像:轉換的布爾數組轉換成字符串使用C#

status[0] = true 
status[1] = true 
status[2] = false 
status[3] = true 

在現實中它更大,但仍低於20,我需要將其轉換成「ABD」。其中每個真實代表字母表中的有序字母。任何人都可以想到一個簡單而有效的方法來做到這一點?

+4

我怕你你需要充實一點你的問題。什麼值(真或假)成爲什麼字母? – 2011-05-04 23:30:12

+0

@Jonathan我會假設0 ='A',1 ='B',......但這對Beth來說很好澄清 – 2011-05-04 23:32:42

+0

很確定她意味着數組的每個索引都與相同的索引相關聯字母。在她的樣本中,'真實,真實,錯誤,真實'=「ABD」。 – Jon 2011-05-04 23:34:33

回答

3
string input = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 

string result = new String(input.ToCharArray() 
         .Take(status.Length) 
         .Where((c, i) => status[i]).ToArray()); 
+0

如果'status'的成員少於26個,這將不起作用。 – svick 2011-05-04 23:37:05

+1

我很抱歉,但我不得不指出我看來有多醜。 :-)我希望看到一些比較表現。 – 2011-05-04 23:37:59

+1

@svick添加了(長度)。 – 2011-05-04 23:40:39

5

我的餐巾紙說,這可能工作...

StringBuilder sb = new StringBuilder(); 
for(int i = 0; i < status.Length; i++) 
{ 
    if(status[i]) 
    { 
     sb.Append((char)('A' + i)); 
    } 
} 

string result = sb.ToString(); 
+0

據我所知,這是行不通的。我得到了656668.原因是你在鑄造之前沒有增加你賦予char的值。你需要做一些像'sb.Append((char)(i +'A'));' – Thomas 2011-05-04 23:38:23

+0

@Thomas,修正。 – svick 2011-05-04 23:44:18

+0

@svick - 好多了。 +1。做得好。 – Thomas 2011-05-04 23:46:36

2
String[] alphabet = new String[] {"A", "B", ... "Z"}; 
String result = ""; 

for (int i = 0; i < status.Length; i++) 
{ 
    if (status[i] == true) result += alphabet[i]; 
} 

基本上,你可以創建一個英文字母的排列和你status陣列的true值匹配到相應的字母。

+0

由於字母是連續的,因此不需要'Alphabet'數組。 – 2011-05-04 23:33:49

+0

'if(foo == true)'!!格蘭芬多5分! (不需要'== true') – 2011-05-04 23:34:13

+0

@Jonathan:非常真實。爲了簡單起見,我創建了字母數組。如果這些字母需要更改,則很容易修改數組。 – 2011-05-04 23:35:07

3

您可以使用LINQ:

var status = new bool[] { true, true, false, true }; 

// alternative 1 
var statusString = string.Concat(
    status.Select((val, index) => val ? (char?)('A' + index) : null) 
      .Where(x => x != null)); 

// alternative 2 
var statusString2 = string.Concat( 
    status.Select((val, index) => val ? (object)(char)('A' + index) : "")); 

// alternative 3 (same as one, no boxing) 
var statusString3 = string.Concat(
    status.Select((val, index) => val ? (char)('A' + index) : ' ') 
      .Where(x => x != ' ')); 


// alternative 4 (no Linq, probably faster) 
var statusString4 = new StringBuilder(status.Length); 
for (int i = 0; i < status.Length; i++) 
{ 
    if (status[i]) 
     statusString4.Append((char)('A' + i)); 
} 
+0

我認爲這是迄今爲止最好的答案+1 – 2011-05-04 23:52:03

+0

+1由於本答案顯示一些LINQ方法,使用Zip怎麼樣(他們最終在.NET 4中添加了這個?)以及在'A'..'Z'的輸入和枚舉上的位置? – 2011-05-05 00:04:20

0

像這樣創建一個類:

class Bool2CharArrayConverter 
{ 

    public static string ConvertArray(bool[] Input) 
    { 
     int asc = 65; 
     StringBuilder response = StringBuilder(); 
     foreach (bool val in Input) 
     { 
      if (val) 
      { 
       response.Append(Convert.ToChar(asc)); 
      } 
      asc++; 
     } 
     return response.ToString(); 
    } 
} 

可以調用這樣的:

 bool[] status = new bool[]{true,true,false,true}; 
    string output = Bool2CharArrayConverter.ConvertArray(status); 
    Console.WriteLine(output); //output = ABD