2015-09-30 47 views
3
using System;  
using System.Collections.Generic;  
using System.Linq; 
using System.Text;  
using System.Threading.Tasks; 

namespace myApp 
{  
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string[] vowels = new string[]{"A","a","E","e","I","i","O","o","U","u"}; 
      for(int j=0;j<vowels.Length;j++) 
      { 
       string[] names = new string[5]; 
       names[0] = "john"; 
       names[1] = "samuel"; 
       names[2] = "kevin"; 
       names[3] = "steve"; 
       names[4] = "martyn"; 
      for (int i = 0; i < names.Length; i++) 
      { 
       if(vowels[j]==names[i]) 
       { 

       } 
      } 


       Console.WriteLine("The output is:"+names[i]); 
      } 
       Console.ReadLine(); 
     } 
    } 
} 

任何人都可以幫助我如何從給定名稱中刪除元音並將其顯示在控制檯中?c# - 如何刪除字符串數組中的元音?

+0

你正在比較元音與整個名稱。您需要循環每個名稱的每個字母以進行元音比較,或者使用[string.contains](https://msdn.microsoft.com/en-us/library/dy85x1sa(v = vs.110).aspx )。此外,你可以只存儲每個元音的一個版本(而不是上下),並在比較中處理大小寫 –

+1

將'if(元音[j] ==名稱[i])'改爲'names [i] .Replace(元音[j],'');' – Les

+0

你應該在開始解析元音之前ToUpper()字符串,並且只在你的字符串[]元音中包含大寫元音。它應該提高性能。 – PeonProgrammer

回答

0

埃澤爾的答案是這樣做的最簡潔和正確的方法,但如果你想更細粒度當和元音你刪除了控制,你也可以嘗試這樣的:

string[] names = new string[5]; 
names[0] = "john"; 
names[1] = "samuel"; 
names[2] = "kevin"; 
names[3] = "steve"; 
names[4] = "martyn"; 

List<char> vowels = new List<char>("AaEeIiOoUuYy".ToCharArray()); 

for(int i = 0; i < names.Length; i++) { 
    string name = names[i]; 
    string trimmedName = name; 

    foreach(char vowel in vowels) { 
     int vowelIndex; 
     while((vowelIndex = trimmedName.IndexOf(vowel)) != -1) { 
      trimmedName = trimmedName.Substring(0, vowelIndex) + trimmedName.Substring(vowelIndex + 1); 
     } 

    } 
    name = trimmedName; 
} 

這是一個比較明確的,更少的高性能,而且肯定更難看,但 - 所以你可能想要去與原創解決方案

-1
forech(string s in strings) 
{ 
    s.Replace("a", ""); 
    // etc 
} 
+4

我沒有downvote,但生病告訴其投票的原因。因此,Replace方法將返回一個新的字符串。它不會更改給定的字符串。這裏是's',你必須再次將它分配給's'來應用更改。因此它不可能用foreach,因爲你不能修改's'作爲它的只讀值。 –

+0

另請注意,在StackOverflow中,僅有代碼的答案通常是不可接受的,因此可能會被刪除。 –

1

首先,你需要一個嵌套循環,如果你是名數組上工作。你必須遍歷你的名字,然後循環通過每個元音。然後使用String.Replace來完成該過程。

name = name.Replace(vowels[j], String.Empty); 
+0

雖然這是正確的,但完整的代碼片段可以大大改善此答案。 –

+0

同意,但我更願意回答確切的問題或填補空白,而不是編寫可以簡單複製和粘貼而不是實際學習任何內容的整個代碼塊。 –

2

您可以使用LINQ它

string[] names = new string[5]; 
names[0] = "john"; 
names[1] = "samuel"; 
names[2] = "kevin"; 
names[3] = "steve"; 
names[4] = "martyn"; 

var vowels = new HashSet<char>("AaEeIioUu"); 


names = names.Select(Name => string.Concat(Name.Where(C => !vowels.Contains(C)))) 
      .ToArray(); 

Console.WriteLine(string.Join(Environment.NewLine, names)); 
+1

@AlexeiLevenkov你是對的。 – Eser

2

您可以使用Regex.Replace

Regex r = new Regex("[aAeEiIoOuU]"); 
//or Regex r = new Regex("[aeiou]", RegexOptions.IgnoreCase); 
string[] names = new string[5]; 
names[0] = "john"; 
names[1] = "samuel"; 
names[2] = "kevin"; 
names[3] = "steve"; 
names[4] = "martyn"; 

for (int i = 0; i < names.Length; i++) 
{ 
    names[i] = r.Replace(names[i], ""); 

    Console.WriteLine("The output is:" + names[i]); 
} 

爲了使您原始的方法工作,你需要添加一個調用string.Replace

names[i] = names[i].Replace(vowels[j], ""); 

這就是說「替換names[i]vowels[j]的任何發生並將結果指定爲names[i]」。

但是,你正在聲明你的名字的陣列內您元音循環,使你不會,如果你添加替換代碼完全得到你所期望的結果。

你也在循環元音和名稱;從邏輯上講,扭轉這種情況可能是有道理的 - 這當然會使結果更容易輸出。像這樣的東西應該爲你工作:

string[] vowels = new string[] { "A", "a", "E", "e", "I", "i", "O", "o", "U", "u" }; 

string[] names = new string[5]; 
names[0] = "john"; 
names[1] = "samuel"; 
names[2] = "kevin"; 
names[3] = "steve"; 
names[4] = "martyn"; 

for (int i = 0; i < names.Length; i++) 
{ 
    for (int j = 0; j < vowels.Length; j++) 
    { 
     names[i] = names[i].Replace(vowels[j], ""); 
    } 

    Console.WriteLine("The output is:" + names[i]); 
} 

編輯

在OP要求的例子,而無需使用Replace的意見。這是一種這樣的方法(@Eser在their answer中有另一種方法)。這種方法迭代輸入字符串的每個字符,直到找到元音。在這一點上已讀取直到那時的字符(不包括元音)被加入到一個StringBuilder

public static string RemoveVowels(string name) 
{ 
    StringBuilder noVowels = new StringBuilder(); 

    //keep track of the last index we read 
    int lastIndex = 0; 

    int i; 
    for (i = 0; i < name.Length; i++) 
    { 
     if (vowels.Contains(name[i])) 
     { 
      //the current index is a vowel, take the text from the last read index to this index 
      noVowels.Append(name, lastIndex, i - lastIndex); 
      lastIndex = i + 1; 
     } 
    } 

    if (lastIndex < i) 
    { 
     //the last character wasn't a vowel so we need to add the rest of the string here. 
     noVowels.Append(name, lastIndex, name.Length - lastIndex); 
    } 

    return noVowels.ToString(); 
} 

上述方法可以被稱爲爲您的陣列中的每個名稱:

for (int i = 0; i < names.Length; i++) 
{ 
    Console.WriteLine("The output is:" + RemoveVowels(names[i])); 
} 

至於使用哪種方法,我會選擇最具可讀性的方法,除非您有一些特定的性能要求,我認爲您需要測量每種方法並選擇最適合您要求的方法。

+0

謝謝你@ petelids..it爲我w –

+0

在我的愚見,使用這個正則表達式有點矯枉過正。 – Andrew

+0

@petelids可以在不使用「替換」的情況下完成嗎? –

-1

您可以使用ToUpper/ToLower來檢查元音,因此您不必爲元音列出兩次(每個套管一次)。

首先遍歷每個名​​稱,然後從每個名稱循環到每個元音。然後,刪除匹配的元音。替換()

這裏是工作示例:

小提琴:https://dotnetfiddle.net/STnyWE

using System;  

public class Program 
{ 
    public static void Main() 
    { 
    string[] vowels = new string[]{"A","E","I","O","U"}; 


      string[] names = new string[5]; 
      names[0] = "john"; 
      names[1] = "samuel"; 
      names[2] = "kevin"; 
      names[3] = "steve"; 
      names[4] = "martyn"; 

      for (int i = 0; i < names.Length; i++) 
      { 
       foreach(var v in vowels) 
       { 

        if(names[i].ToString().ToUpper().Contains(v.ToString())) 
        { 
         Console.WriteLine(names[i]); 
         names[i] = names[i].ToString().ToUpper().Replace(v.ToString(), ""); 
         Console.WriteLine("The output is: "+names[i].ToString().ToLower()); 
        } 
       } 
      } 

      Console.ReadLine(); 
    } 
} 
+1

與此相關的問題是您正在丟失原始名稱中的任何可能的大寫字母。此外,這種方法有點冗長,如果你可以用Linq做更短的代碼,就可以在其他答案中看到(例如我的例子)。 – Andrew

+0

我絕對喜歡Linq。我是一個粉絲。我只是想使用他現有的代碼並添加一點來解決問題。 OP在他的例子中沒有名字,所以我把它們都轉換成了較低的值。當然,我們可以使用ToTitleCase作爲像CultureInfo.CurrentCulture.TextInfo.ToTitleCase(names [i] .ToString()。ToLower())這樣的名稱,如果套管發生在其他地方,那麼這將是一個問題。 – NKD

0

我覺得這是最簡單的選擇:

static void Main(string[] args) 
{ 
    string[] names = new string[] { "john", "samuel", "george", "steve", "martyn" }; 

    foreach (var name in names) 
    { 
     string withoutVowels = new string(name.Where(x => !"aeiou".Contains(x)).ToArray()); 
     Console.WriteLine("The output is: " + withoutVowels); 
    } 
    Console.ReadKey(); 
} 

如果你碰巧需要大寫請使用下面這行代替:

string withoutVowels = new string(name.Where(x => "aeiou".IndexOf(x.ToString(), StringComparison.InvariantCultureIgnoreCase) < 0).ToArray()); 

當然,您也可以使用「aeiouAEIOU」並堅持第一個選項。

只是爲了它的緣故,極短的版本,基於埃澤爾的回答是:

static void Main(string[] args) 
{ 
    string[] names = new string[] { "johnE", "samuel", "george", "steve", "martyn" }; 
    Console.WriteLine(string.Join(Environment.NewLine, names.Select(s => new string(s.Where(x => !"aeiou".Contains(x)).ToArray())))); 
}