C# 如何正确地集成代码

C# 如何正确地集成代码,c#,C#,我的代码应该是把一个短语翻译成拉丁语。每个单词的结尾必须有一个“ay”,每个单词的第一个字母都应该放在“ay”之前 ex wall=“allway” 有什么想法吗?这是我能想到的最简单的方法 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace english_to_pig_latin { class Program { st

我的代码应该是把一个短语翻译成拉丁语。每个单词的结尾必须有一个“ay”,每个单词的第一个字母都应该放在“ay”之前 ex wall=“allway” 有什么想法吗?这是我能想到的最简单的方法

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace english_to_pig_latin
{
    class Program
    {
        static void Main(string[] args)
        {

            Console.WriteLine("THIS IS A English to Pig Latin translator");
            Console.WriteLine("ENTER Phrase");

            string[] phrase = Console.ReadLine().Split(' ');

            int words = phrase.Length;
            StringBuilder sb = new StringBuilder();

            for (int i = 0; i < words; i++)
            {
                //to add ay in the end
                /*sb.Append(phrase[i].ToString());
                sb.Append("ay ");

                Console.WriteLine(sb);*/
            }
            Console.ReadLine();
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
名称空间英语到拉丁语
{
班级计划
{
静态void Main(字符串[]参数)
{
Console.WriteLine(“这是一个从英语到拉丁语的翻译”);
Console.WriteLine(“输入短语”);
string[]phrase=Console.ReadLine().Split(“”);
int单词=短语长度;
StringBuilder sb=新的StringBuilder();
for(int i=0;i
我认为您需要这种转换:
短语[I]。子字符串(1)+短语[I][0]+“ay”
首先您需要定义您的规则。你的描述缺乏真正的拉丁语规则。例如,英语“sharp”被正确地“Pig拉丁化”为“arpshay”,而不是“harpsay”,正如你上面解释的那样。(但我更喜欢使用“arp sh ay”来帮助阅读PigLatin,并且使用连字符可以将其反向翻译回英语。)我建议您首先找到一些PigLatin的规则。你的开始是个好的开始。您的代码现在将一个短语分成(几乎)个单词。请注意,您的代码将“Please,Joe”转换为“Please”和“Joe”tho,您可能不希望将该逗号发送给逐字翻译程序

当你定义你的规则时,我建议你考虑如何把这些单词打成拉丁语: 你好-->ellohay(一个普通的词), 字符串-->'ingstary'('str'是移动到末尾的整个辅音字符串), 苹果-->'appleway'、'appleay'或'appleyay'(取决于你的拉丁语方言), queen-->“eenquay”(“qu”是这里的辅音串), 黄色-->“ellowyay”(这里y是辅音), 节奏-->“ythmrhay”(这里y是元音), 天空-->“yskay”(这里y是元音)。 请注意,对于任何以“qu”(如“queen”)开头的单词,这个“qu”也是一个需要处理的特殊条件。注意,Y可能是一个辅音,当它开始一个英语单词,但是在一个单词的中间或结尾时,它是一个元音。 这些单词的连字符拉丁语版本为: ello-h-ay、ing str-ay、(‘苹果路’、‘苹果路’或‘苹果路’)、‘een-qu-ay’、‘ellow-y-ay’、‘ythm rh-ay’和‘y-sk-ay’。这种连字号既能让阅读更容易,也能让计算机解析器将Pig拉丁语反译成英语。但不幸的是,许多人只是将Pig拉丁语单词塞进一块,而没有显示任何连字号分隔,因此,简单地颠倒翻译过程就无法避免歧义

真正的猪拉丁语是根据单词的发音,而不是拼写,所以如果没有一个非常复杂的单词到音素系统,这太难了。但大多数(优秀的)拉丁语翻译人员都会处理上述情况,而忽略其他例外情况,因为英语在发音上确实是一种非常糟糕的语言

所以我的第一个建议是制定一套规则。我的第二个建议是使用两个函数,
PigLatinizePhrase()
PigLatinizeWord()
,其中
PigLatinizePhrase()
方法将短语解析为单词(和标点符号),并为每个单词调用
PigLatinizeWord()
,不包括任何标点符号。您可以使用一个简单的循环遍历每个字符,并测试char.isleter以确定它是否为字母。如果是字母,则将其添加到字符串生成器并移动到下一个字母。如果它不是一个字母,并且字符串生成器不是空的,那么将该单词发送给您的单词解析器进行解析,然后将非字母添加到结果中。这将是您的
PigLatinizePhrase()
方法的逻辑。以下是我的代码,它可以做到这一点:

/// <summary>
/// </summary>
/// <param name="eng">English text, paragraphs, etc.</param>
/// <param name="suffixWithNoOnset">Used to differentiate between Pig Latin dialects.
/// Known dialects may use any of: "ay", "-ay", "way", "-way", "yay", or "-yay".
/// Cooresponding translations for 'egg' will yield: "eggay", "egg-ay", "eggway", "egg-way", "eggyay", "egg-yay".
/// Or for 'I': "Iay", "I-ay", "Iway", "I-way", "Iyay", "I-yay".
/// </param>
/// <returns></returns>
public static string PigLatinizePhrase(string eng, string suffixWithNoOnset = "-ay")
{
    if (eng == null) { return null; } // don't break if null
    var word = new StringBuilder(); // only current word, built char by char
    var pig = new StringBuilder(); // pig latin text
    char prevChar = '\0';
    foreach (char thisChar in eng)
    {
        // the "'" test is so "I'll", "can't", and "Ashley's" will work right.
        if (char.IsLetter(thisChar) || thisChar == '\'')
        {
            word.Append(thisChar);
        }
        else
        {
            if (word.Length > 0)
            {
                pig.Append(PigLatinizeWord(word.ToString(), suffixWithNoOnset));
                word = new StringBuilder();
            }
            pig.Append(thisChar);
        }
        prevChar = thisChar;
    }
    if (word.Length > 0)
    {
        pig.Append(PigLatinizeWord(word.ToString(), suffixWithNoOnset));
    }
    return pig.ToString();
} // public static string PigLatinizePhrase(string eng, string suffixWithNoOnset = "-ay")

我以前曾用JavaScript编写过piglatize()方法,这对我来说很有趣。:)我喜欢把我的C#版本做得更具特色,让它能够翻译成6种不同的猪拉丁语“方言”,特别是因为C#是我最喜欢的(编程)语言

从问题的核心开始,即将单个单词转换为pig拉丁语(即创建一个函数,该函数接受一个单词,并返回其pig拉丁语版本),然后在工作正常的情况下,处理完整的句子。Stringbuilder也比myword+=“ay”快得多。好吧,假设你有一万字。现在不要紧了,
Piglatin
标记不用于此目的。请确保你看到了标签描述是什么。嗯,把“Apache’s Pig”称为“PigLatin”标签似乎是一件愚蠢的事情,因为PigLatin与标签的“本意”非常不同。我认为PigLatin应该用于真正的PigLatin,Apache的Pig东西应该使用一个新标签。有人知道我如何投票赞成我的意见吗?工程师,我推荐您使用PigLatin,我认为这是正确的用法。:)@ShawnKovac投票支持标签更改的方式是为讨论中的站点转到meta。在这种情况下,它将是。在那里,问一个与你想要的改变相关的问题,包括所有相关信息,然后等待“负责人”注意到。这通常发生得很快。
/// <summary>
/// </summary>
/// <param name="eng">English word before being translated to Pig Latin.</param>
/// <param name="suffixWithNoOnset">Used to differentiate between Pig Latin dialects.
/// Known dialects may use any of: "ay", "-ay", "way", "-way", "yay", or "-yay".
/// Cooresponding translations for 'egg' will yield: "eggay", "egg-ay", "eggway", "egg-way", "eggyay", "egg-yay".
/// Or for 'I': "Iay", "I-ay", "Iway", "I-way", "Iyay", "I-yay".
/// </param>
/// <returns></returns>
public static string PigLatinizeWord(string eng, string suffixWithNoOnset = "-ay")
{
    if (eng == null || eng.Length == 0) { return eng; } // don't break if null or empty

    string[] onsetAndEnd = GetOnsetAndEndOfWord(eng);
    // string h = string.Empty;
    string o = onsetAndEnd[0]; // 'Onset' of first syllable that gets moved to end of word
    string e = onsetAndEnd[1]; // 'End' of word, without the onset
    bool hyphenate = suffixWithNoOnset.Contains('-');
    // if (hyphenate) { h = "-"; }

    var sb = new StringBuilder();
    if (e.Length > 0) { sb.Append(e); if (hyphenate && o.Length > 0) { sb.Append('-'); } }
    if (o.Length > 0) { sb.Append(o); if (hyphenate) { sb.Append('-'); } sb.Append("ay"); }
    else { sb.Append(suffixWithNoOnset); }

    return sb.ToString();
} // public static string PigLatinizeWord(string eng)

public static string[] GetOnsetAndEndOfWord(string word)
{
    if (word == null) { return null; }
    // string[] r = ",".Split(',');
    string uppr = word.ToUpperInvariant();
    if (uppr.StartsWith("QU")) { return new string[] { word.Substring(0,2), word.Substring(2) }; }
    int x = 0; if (word.Length <= x) { return new string[] { string.Empty, string.Empty }; }

    if ("AOEUI".Contains(uppr[x])) // tests first letter/character
    { return new string[] { word.Substring(0, x), word.Substring(x) }; }
    while (++x < word.Length)
    {
        if ("AOEUIY".Contains(uppr[x])) // tests each character after first letter/character
        { return new string[] { word.Substring(0, x), word.Substring(x) }; }
    }
    return new string[] { string.Empty, word };
} // public static string[] GetOnsetAndEndOfWord(string word)