#c# #asp.net
#c# #asp.net
Вопрос:
Я сравниваю два значения текстового поля.
Я извлекаю слово changes из второго текстового поля, но работаю только с некоторым предложением, см. Ниже, Вывод нормально
Проблема возникает, когда я пишу другое предложение во втором текстовом поле, например: «Привет, ты сделан»
WebForm1.aspx
<body>
<form id="form1" runat="server">
<div>
<asp:TextBox ID="ftextbox" runat="server"></asp:TextBox>
<asp:TextBox ID="stextbox" runat="server"></asp:TextBox>
<br /><br />
<asp:Button ID="Button1" runat="server" Text="Compare" OnClick="Button1_Click" />
<br />
<asp:Label ID="Label1" runat="server" Text=""></asp:Label><br /><br />
<asp:Label ID="Label2" runat="server" Text=""></asp:Label><br /><br />
</div>
</form>
</body>
</html>
WebForm1.aspx.cs
protected void Button1_Click(object sender, EventArgs e)
{
if (IsPostBack)
{
Label2.Text = "";
Label1.Text = "";
}
//change word
var result = stextbox.Text.Split(new char[] { ' ' }).Except(ftextbox.Text.Split(new char[] { ' ' })).ToArray();
int count = result.Length;
for (int i = 0; i < count; i )
{
Label1.Text = result[i].ToString() "amp;nbsp;amp;nbsp;amp;nbsp;";
}
Label2.Text = "Old Text is:";
Label1.Text = "Chnage Text is:" Label1.Text;
//old Words
string[] tempArr1 = ftextbox.Text.Split(' ');
string[] tempArr2 = stextbox.Text.Split(' ');
int counter = 0;
for (int i = 0; i < tempArr1.Length; i )
{
if (tempArr1[i] != tempArr2[i])
{
Label2.Text = Label2.Text tempArr1[i] "amp;nbsp;amp;nbsp;amp;nbsp;";
counter ;
}
}
}
Первое изображение показывает идеальный результат, а второе — нет.
Комментарии:
1. citeseerx.ist.psu.edu/viewdoc /… , является хорошим началом для сравнения строк. Основываясь на вашей серии вопросов, пытаетесь ли вы реализовать какую-то разницу, например, при сравнении кодов в редакторе кода? Важна ли реализация или вам нужен мини-файл через стороннюю библиотеку?
Ответ №1:
Вы можете получить все уникальные слова во входных данных, когда вы используете Split()
, чтобы разрезать их на слова, а затем использовать Distinct()
, чтобы получить только уникальные слова.
Теперь вы можете использовать эти два IEnumerable<string>
для их сравнения Except()
, чтобы получить разные строки.
Функция CompareString:
public List<string> CompareStrings(string s1, string s2) {
// Create IEnumerable<string> of each word in the given string
IEnumerable<string> set1 = s1.Split(' ').Distinct();
IEnumerable<string> set2 = s2.Split(' ').Distinct();
// Compare and return the Difference
return set1.Except(set2).ToList();
}
Теперь мы можем вызвать эту функцию дважды, чтобы обнаружить изменения в ftextbox
сравнении с stextbox
и изменения в stextbox
сопоставлении с ftextbox
Пример:
protected void Button1_Click(object sender, EventArgs e) {
string oldtText = string.Empty;
// Get words that are different in ftextbox compared to stextbox
foreach (string change in CompareStrings(ftextbox.Text, stextbox.Text)) {
oldText = " " change;
}
Label2.Text = "Old Text is:" oldText;
//----------------------------------------------------------------------
string newText = string.Empty;
// Get words that are different in stextbox compared to ftextbox
foreach (string change in CompareStrings(stextbox.Text, ftextbox.Text)) {
newText = " " change;
}
Label1.Text = "Change Text is:" newText;
}
Комментарии:
1. почему здесь
you
ключевое слово distinct, а другое ключевое слово не является distinct, потому что вы только один раз, не могли бы вы объяснить i.stack.imgur.com/hZ6iY.png2. посмотрите этот отладчик, почему фактический вывод и отладчик отличаются i.stack.imgur.com/m8DOc.png
3. Ах, это то, что делает первая строка, — это помещает все уникальные строки в IEnuemrable, а в возврате вы отправляете только те, которые отличаются
4. если я не использую ключевое слово distict, тогда вывод в порядке, почему?
5. Это потому, что сейчас вы не вводите слово дважды. Если вы сделаете это жестко, это будет корректно работать только с
.Distinct()
добавленным.