2015-09-30 3 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])' to 'names [i] .Replace (гласные [j], ''); ' – Les

+0

Вы должны ToUpper() строку перед началом разбора гласных и содержать только гласные в верхнем регистре в строке [] гласных. Это должно улучшить производительность. – PeonProgrammer

ответ

0

Eşer является наиболее емким и правильным способом сделать это, но в случае, если вы хотите более мелкозернистым контроль над когда и какие гласные вы удаляете, вы можете попробовать что-то вроде:

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

i did not downvote, но плохо сказать причину, по которой его голос проголосовали. В результате метод «Заменить» вернет новую строку. он не изменит данную строку. здесь '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], ""); 

Это означает, что «замените любые события vowels[j] на names[i] и назначьте результат 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]); 
} 

Редактировать

В комментариях ОП просили пример без использования 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..или за меня для меня –

+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 (имена [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» и придерживаться первого варианта.

Только ради этого, очень короткой версии, на основе ответа Eşer в: ответ

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())))); 
} 
Смежные вопросы