对不起,我正在尝试制作简单的应用程序,将单词转换为单词。例如
启用=能够 付款=付款
我记事本上的文字是“启用付款”
我正在使用上面的2个示例单词,而且我没有得到我需要的东西。我在notepad.txt上写了“启用”和“付款”。然后应用程序将启动并获得该单词。
并且应用程序将开始修剪单词剪切“En”和“ment”,以便他们的结果将“能够”和“付费”
我的应用程序可以将单词“enable”修剪为“able”。和“支付”到“支付”但是,如果我写了2个字或更多字,例如“启用支付”或“支付启用”,则应用程序无法正常工作
这是用户界面image
这是源代码,
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
namespace KTM'
{
public partial class KTM : Form
{
public string notepad;
public KTM()
{
InitializeComponent();
textBox1.Enabled=false;
button2.Enabled = false;
button3.Enabled = false;
}
void enable()
{
button2.Enabled = true;
button3.Enabled = true;
}
private void button1_Click(object sender, EventArgs e)
{
string dir = Application.StartupPath.ToString();
OpenFileDialog fdlg = new OpenFileDialog();
fdlg.Title = "Open *txt files";
fdlg.InitialDirectory = @dir;
fdlg.Filter = "Text files (*.txt)|*.txt|Text Files (*.txt)|*.txt";
fdlg.FilterIndex = 2;
fdlg.RestoreDirectory = true;
if (fdlg.ShowDialog() == DialogResult.OK)
{
textBox1.Text = fdlg.FileName;
}
else
{
}
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
if (textBox1.Text.Equals(""))
{
}
else
{
enable();
}
}
private void button2_Click(object sender, EventArgs e)
{
notepad = textBox1.Text;
StreamReader sr = new StreamReader(notepad);
string paragraf = sr.ReadToEnd();
sr.Close();
string[] kata = paragraf.Split(' ');
int i = 0;
//MessageBox.Show(kata[0]+" "+kata[1]+" "+kata[2]);
foreach (string ambil in kata)
{
if (kata[i].StartsWith("en"))
{
kata[i] = kata[i].Substring(2);
}
if(kata[i].EndsWith("ment"))
{
int len = kata[i].Length;
int kepake = len - 4;
kata[i] = kata[i].Substring(0, kepake);
}
}
i++;
StreamWriter sw = new StreamWriter(notepad);
i = 0;
foreach (string ambil in kata)
{
sw.Write(kata[i]+" ");
}
i++;
sw.Flush();
sw.Close();
MessageBox.Show("Converted and Saved ","KTM Stemming",MessageBoxButtons.OK,MessageBoxIcon.Information);
}
private void button3_Click(object sender, EventArgs e)
{
notepad = textBox1.Text;
System.Diagnostics.Process.Start(notepad);
}
}
}
答案 0 :(得分:2)
你的foreach循环设计不正确。既然你在循环中更新数组,你最好用迭代器做一个简单的for循环:
for (int i = 0; i < kata.Length; i++)
{
if (kata[i].StartsWith("en"))
{
kata[i] = kata[i].Substring(2);
}
if(kata[i].EndsWith("ment"))
{
int len = kata[i].Length;
int kepake = len - 4;
kata[i] = kata[i].Substring(0, kepake);
}
}
但是,在第二个循环中,foreach是有道理的。但是你需要使用ambil变量:
foreach (string ambil in kata)
{
sw.Write(ambil + " ");
}
编辑:
你说上面的说法不起作用,但它对我有用。也许您的问题与表单中的其他一些代码有关。由于在同一方法中混合使用不同类型的逻辑并不是一种好的做法,因此我建议将根词解析逻辑分解为自己的方法,例如:
private string getRootWords(string paragraf)
{
string[] kata = paragraf.Split(' ');
for (int i = 0; i < kata.Length; i++)
{
if (kata[i].StartsWith("en"))
{
kata[i] = kata[i].Substring(2);
}
if (kata[i].EndsWith("ment"))
{
int len = kata[i].Length;
int kepake = len - 4;
kata[i] = kata[i].Substring(0, kepake);
}
}
StringBuilder builder = new StringBuilder();
foreach (string ambil in kata)
{
builder.Append(ambil + " ");
}
return builder.ToString();
}
这种方法对我有用。当我打电话给getRootWords("Enable payment")
时,它会返回“能够支付”,这是你想要的输出,据我所知。
答案 1 :(得分:1)
您正在循环外增加索引变量i
,您应该在其中增加它:
foreach (string ambil in kata)
{
if (kata[i].StartsWith("en"))
{
kata[i] = kata[i].Substring(2);
}
if(kata[i].EndsWith("ment"))
{
int len = kata[i].Length;
int kepake = len - 4;
kata[i] = kata[i].Substring(0, kepake);
}
i++;
}
最好还是直接使用for
循环(你没有使用ambil
变量):
for (i=0; i<kata.Lenght; i++)
{
if (kata[i].StartsWith("en"))
{
kata[i] = kata[i].Substring(2);
}
if(kata[i].EndsWith("ment"))
{
int len = kata[i].Length;
int kepake = len - 4;
kata[i] = kata[i].Substring(0, kepake);
}
}
答案 2 :(得分:1)
foreach (string ambil in kata)
{
if (kata[i].StartsWith("en"))
{
kata[i] = kata[i].Substring(2);
}
if(kata[i].EndsWith("ment"))
{
int len = kata[i].Length;
int kepake = len - 4;
kata[i] = kata[i].Substring(0, kepake);
}
}
这是你问题的一部分,因为它是一个foreach但你正在使用它像for循环。你可能想要for (int i=0; i<kata.Length; i++)
你正在写你的for循环之外的文件,所以要么你需要把你的写作放在for循环中,要么另一个for循环。
答案 3 :(得分:0)
谢谢你的帮助! :)我真的非常感激,虽然我不明白一些答案:D至少你们帮助我构建逻辑,我解决了这个问题
private void button2_Click(object sender, EventArgs e)
{
notepad = textBox1.Text;
StreamReader sr = new StreamReader(notepad);
string paragraf = sr.ReadToEnd();
sr.Close();
StreamWriter sw = new StreamWriter(notepad);
string[] kata = paragraf.Split(' ');
for (int i = 0; i < kata.Length; i++)
{
if (kata[i].StartsWith("en"))
{
kata[i] = kata[i].Substring(2);
//cutting the EN*
}
if (kata[i].EndsWith("ment"))
{
int panjang = kata[i].Length;
int sisa = panjang - 4;
kata[i] = kata[i].Substring(0, sisa);
//cutting the *Ment
}
if(kata[i].EndsWith("ous"))
{
int panjang = kata[i].Length;
int sisa = panjang - 3;
kata[i] = kata[i].Substring(0, sisa);
//cutting the ous, tremendous, hazardous
}
if (kata[i].EndsWith("ied"))
{
int panjang = kata[i].Length;
int sisa = panjang -1;
kata[i] = kata[i].Substring(0, sisa);
//cutting ied
}
if (kata[i].EndsWith("ly"))
{
int panjang = kata[i].Length;
int sisa = panjang - 2;
kata[i] = kata[i].Substring(0, sisa);
//cutting fluently, diligently
}
sw.Write(kata[i] + " ");
}
sw.Flush();
sw.Close();
MessageBox.Show("Converted and Saved ", "KTM Stemming", MessageBoxButtons.OK, MessageBoxIcon.Information);
}