我想创建一个程序,它接受你输入的字符串并将其转换为不同的字符串,所以如果我输入"Hello World"
,每个字符串将变成一个字符串,控制台将输出类似{{1每个"Alpha Beta Gamma Gamma Zeta Foxtrot Dona Rama Lana Zema"
char
。
我尝试这样做:
word
但我无法让它发挥作用。 任何人都可以给我一个提示或指出我正确的方向吗?
答案 0 :(得分:5)
您需要的是Dictionary<char,string>
var words = new Dictionary<char, string>();
words.Add('a', "Alpha");
words.Add('b',"Beta");
...
string input = Console.ReadLine();
string[] contents = new string[input.Length];
for (int i = 0; i < input.Length; i++)
{
if (words.ContainsKey(input[i]))
{
contents[i] = words[input[i]];
}
}
string result = string.Join(" ", contents);
或LINQ
方式:
var result = string.Join(" ", input.Where(words.ContainsKey).Select(c => words[c]));
答案 1 :(得分:1)
首先,缓冲区是一个char数组。数组具有固定的大小,为了扩展它们,您需要创建一个新的。为了克服这项繁琐的工作,有一个StringBuilder
类可以自动执行此操作。
其次,如果你在if语句中保留这些'Alpha','Beta',...字符串,你将会有很长的代码。您可以使用字典替换它,或者从单个字符串或文本文件创建它。
将其付诸实践:
class MyClass
{
static Dictionary<char, string> _map = new Dictionary<char, string>();
static MyClass()
{
_map.Add('a', "Alpha");
_map.Add('b', "Beta");
// etc
}
static string WordMap(string data)
{
var output = new StringBuilder();
foreach (char c in data)
{
if (_map.ContainsKey(c))
{
output.Append(_map[c]);
output.Append(' ');
}
}
return output.ToString();
}
}
没有字典的解决方案:
static string WordMap(string data)
{
const string words = "Alpha Beta Gamma Delta ...";
string[] wordMap = words.Split(' ');
var output = new StringBuilder();
foreach (char c in data)
{
int index = c - 'a';
if (index >= 0 && index < wordMap.Length)
{
output.Append(wordMap[index]);
output.Append(' ');
}
}
return output.ToString();
}
答案 2 :(得分:0)
提示: 您不必从字符串创建字符数组,您可以通过索引器轻松访问字符串中的单个字符:
char some = "123"[2];
当你使用“”时,你创建的字符串不是char,因此你应该使用''创建字符进行比较:
if (some == 'a') Console.WriteLine("character is a, see how you compare chars!!!");
答案 3 :(得分:0)
使用LINQ和String.Join
,它简短易读。由于您想要为特殊字符添加新单词,因此您需要一个单词映射。我会使用Dictionary<char, string>
:
static Dictionary<char, string> wordMap = new Dictionary<char, string>()
{
{'a', "Alpha"}, {'b', "Beta"},{'c', "Gamma"}, {'d', "Delta"}
};
static string WordMap(string value)
{
var strings = value
.Select(c =>
{
string word;
if(!wordMap.TryGetValue(c, out word))
word = c.ToString();
return word;
});
return string.Join("", strings);
}
测试:
string newString = WordMap("abcdeghj"); // AlphaBetaGammaDeltaeghj
答案 4 :(得分:0)
一个很好的解决方案......
string[] words = { "Alpha", "Beta", "C_word", "D_Word" }; // ....
string myPhrase = "aBC";
myPhrase.Replace(" ", string.Empty).ToList().ForEach(a =>
{
int asciiCode = (int)a;
/// ToUpper()
int index = asciiCode >= 97 ? asciiCode - 32 : asciiCode;
Console.WriteLine(words[index - 65]); // ascii --> 65-a , 66-b ...
});
答案 5 :(得分:0)
另一个包含not found
选项的答案变体。
static Dictionary<char, string> Mapping =
new Dictionary<char, string>()
{ { 'a', "alpha" }, { 'b', "beta" }, { 'c', "gamma" }, { 'd', "zeta" } };
static void Main(string[] args)
{
string test = "abcx";
Console.WriteLine(string.Join(" ", test.Select(t => GetMapping(t))));
//output alpha beta gamma not found
Console.ReadKey();
}
static string GetMapping(char key)
{
if (Mapping.ContainsKey(key))
return Mapping.First(a => a.Key == key).Value;
else
return "not found";
}
答案 6 :(得分:-1)
只需在构建结果的位置声明第二个变量即可。 我认为你有一些语法问题,你需要在一个“==” 条件,否则这是一项任务。
static string WordMap(string value)
{
string result = string.Empty;
char[] buffer = value.ToCharArray();
for (int i = 0; i < buffer.Length; i++)
{
if (letter == "a")
{
result += ("Alpha");
}
//and so on
}
return result;
}
但我只会这样做,如果这是“只是为了好玩”的代码, 因为它不会很快。 像我一样建立结果很慢,更好的方法是
result = string.Concat(result, "(Alpha)");
更快的方法是使用StringBuilder(s。文档), 它为您提供快速方便的方法来处理更大的字符串。 这里只有垮台,你需要知道一点,结果有多大 将以字符为单位,因为您需要提供起始维度。 在这里你不应该只用1或100开始。每次,当StringBuilder时 已满,它会创建一个新的更大的实例并复制值,因此需要多个实例 这将填补你的记忆,这可能会导致内存不足异常, 在处理数万个字符时。
但正如所说,只是为了有趣的代码,所有这些并不重要...... 当然,您需要注意,如果您这样做,您的结果将会如此 在一条直线上,没有休息。如果你想要换行符,请在末尾添加“\ n” 字符串。或者添加任何你需要的东西。
此致
马库斯