Странная проблема в С#, связанная с DataSet

В настоящее время я работаю над программой, которая преобразует японские символы в английские символы и наоборот. Однако это мало работает. Последние несколько дней я пробовал все, чтобы попытаться заставить его работать, возможно, это какая-то небольшая глупая проблема, но я просто не могу ее найти. Я новичок во всем этом, поэтому любая помощь приветствуется.

Теперь проблема в том, что он хочет преобразовать только символы ромадзи, однако, если изменить какой-либо код, в частности, если я изменю следующее с «если» на еще, если, тогда он преобразует хирагану и катакану, но НЕ ромадзи.

        string fromtype = "";

        // Determines what type the character is currently
        // && fromtype == "" added to avoid weird unexplainable errors...
        if (CharacterTable.Select("Romaji = '" + character + "'") != null && fromtype == "")
        {
            fromtype = "Romaji";
        }
        else if (CharacterTable.Select("Hiragana = '" + character + "'") != null && fromtype == "")
        {
            fromtype = "Hiragana";
        }
        else if (CharacterTable.Select("Katakana = '" + character + "'") != null && fromtype == "")
        {
            fromtype = "Katakana";
        }

Я даже пытался удалить эту функцию, которая пытается автоматически определить тип персонажа, и сделать это с помощью радиокнопок, чтобы пользователь мог его выбрать, но почему-то кажется, что он делает почти то же самое... Так что я полностью запутался в этот момент, любая помощь очень приветствуется.

Вот полный код:

public string CheckCharacter(string character, int RequestedCharType)
        {
            // RequestedCharType
            // 1 = Romaji
            // 2 = Hiragana
            // 3 = Katakana

            //-- Instantiate the data set and table
            DataSet CharacterDatabase = new DataSet();
            DataTable CharacterTable = CharacterDatabase.Tables.Add();

            //-- Add columns to the data table
            CharacterTable.Columns.Add("Romaji", typeof(string));
            CharacterTable.Columns.Add("Hiragana", typeof(string));
            CharacterTable.Columns.Add("Katakana", typeof(string));


            //-- Add rows to the data table
            CharacterTable.Rows.Add("a", "あ", "ア");
            CharacterTable.Rows.Add("i", "い", "イ");


            // Sets fromtype to the type the character(s) currently is/are
            string fromtype = "";

            // Determines what type the character is currently
            // && fromtype == "" added to avoid weird unexplainable errors...
            if (CharacterTable.Select("Romaji = '" + character + "'") != null && fromtype == "")
            {
                fromtype = "Romaji";
            }
            else if (CharacterTable.Select("Hiragana = '" + character + "'") != null && fromtype == "")
            {
                fromtype = "Hiragana";
            }
            else if (CharacterTable.Select("Katakana = '" + character + "'") != null && fromtype == "")
            {
                fromtype = "Katakana";
            }



           // generates a new variable to store the return in
           DataRow[] filteredRows = CharacterTable.Select(fromtype + " = '" + character + "'");

            // Return the converted character in the requested type
            foreach (DataRow row in filteredRows)
            {
                if (RequestedCharType == 1)
                {
                    return row["Romaji"].ToString();
                }
                if (RequestedCharType == 2)
                {
                    return row["Hiragana"].ToString();
                }
                if (RequestedCharType == 3)
                {
                    return row["Katakana"].ToString();
                }
            }


            // if it couldn't find the character, return the original character
            return character;
        }

person Community    schedule 26.01.2012    source источник
comment
FWIW они называются римскими буквами, отсюда и «ромадзи» (однако цифры арабские — к счастью, нам не нужно использовать римские цифры).   -  person Paul Ruane    schedule 26.01.2012


Ответы (1)


Ваша проблема в непонимании того, как работает Select. Select не возвращает null, если совпадений нет, поэтому ваш первый if всегда истинен. Вместо этого вам нужно проверить, были ли какие-либо результаты, которые вы можете сделать с Enumerable.Any() (добавить using System.Linq):

if (CharacterTable.Select("Romaji = '" + character + "'").Any())
{
    fromtype = "Romaji";
}
else ...

В качестве альтернативы вы можете проверить длину массива:

if (CharacterTable.Select("Romaji = '" + character + "'").Length > 0)
{
    fromtype = "Romaji";
}
else ...
  • Я не уверен, что бит fromType == "" об этом, конечно, не нужен.
  • Рассматривая возможность создания типа enum для ваших типов char.
  • Этот метод можно сделать статическим.
  • Рассмотрите возможность использования оператора switch вместо if (RequestedCharType == 1) &c.
person Paul Ruane    schedule 26.01.2012
comment
Хорошо, спасибо! Я пойду попробую, и мне очень жаль, но я все еще очень новичок во всем этом, так что пока программа просто РАБОТАЕТ, я буду счастлив, хе-хе. - person ; 26.01.2012
comment
Не нужно сожалеть. Мы все были там когда-то (и не так далеко, как хотелось бы). - person Paul Ruane; 26.01.2012
comment
ДА, это работает ^^ Большое спасибо, я пытался понять это уже несколько дней ^^ - person ; 26.01.2012
comment
Не волнуйтесь. Удачи со второй версией :) - person Paul Ruane; 26.01.2012