【问题标题】:How do I compare one string with another如何将一个字符串与另一个字符串进行比较
【发布时间】:2016-06-19 19:06:17
【问题描述】:

我正在处理这个项目,当我将某些内容保存到剪贴板时,它会将其存储在一个文本框中,然后等到我保存其他内容,然后将该值也存储在文本框中..

它工作得很好,但我想让它变得更好,因为我目前有一个计时器作为循环来检查当前值是否已被使用(请参阅下面的代码)

我想将其更改为可以将变量与字符串进行比较的位置,但我真的不知道该怎么做。

我试过这个..但我也不知道拿什么来比较它,所以我不能再进一步了。 var containsData = Clipboard.GetText();

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace CBR
{
    public partial class mainFrm : Form
    {
        public mainFrm()
        {
            InitializeComponent();
        }



        private void mainFrm_Load(object sender, EventArgs e)
        {
        }



        #region ButtonsAndTimer
        private void clipboardUpdater_Tick(object sender, EventArgs e)
        {
            if (!clipboardSaveTextBox.Text.Contains(Clipboard.GetText()))
            {
                clipboardSaveTextBox.Text += "\n" + Clipboard.GetText();
            }
        }


        private void monitorButton_Click(object sender, EventArgs e)
        {
            clipboardUpdater.Enabled = true;
        }

        private void stopMonitorButton_Click(object sender, EventArgs e)
        {
            clipboardUpdater.Enabled = false;
        }
        #endregion
    }
}

【问题讨论】:

  • Contains 区分大小写,如果这对您的逻辑是正确的,那么您唯一可以改进的就是删除对 GetText 的两个调用。只需调用 Clipboard.GetText 并将结果分配给一个变量,然后使用该变量进行检查和添加

标签: c# string variables compare


【解决方案1】:

如果您想使用不区分大小写的比较,您可以在调用 Contains 方法之前在两个字符串中添加 ToLower:

 if (!clipboardSaveTextBox.Text.ToLower().Contains(Clipboard.GetText().ToLower()))
            {
                clipboardSaveTextBox.Text += "\n" + Clipboard.GetText();
            }

【讨论】:

  • 你可以将它存储在一个变量中,但我认为这不是性能的瓶颈。也可以使用不区分大小写的 ToLower 版本来实现其他比较方法
  • 如我所见,这段代码在一个事件中,该事件通常在很长的时间间隔内被调用,因此您根本不会遇到任何性能问题。您不必担心调用 ToLower 两次。
  • 问题是,我需要它循环,假设我复制了其他东西,它应该检测到,但我该怎么做呢?我尝试使用间隔为 0.5 秒的计时器滴答事件,但这使得它一遍又一遍地复制粘贴相同的东西,直到我复制其他东西然后它一遍又一遍地复制粘贴,明白我的意思吗?
  • 不,你是什么意思,你想复制什么,你检测到什么?
【解决方案2】:

给定您的实际代码,我认为您不需要逐个字符串比较,但您希望文本框中有唯一的字符串。如果是这种情况,那么您可以考虑另一种方式来存储字符串,而不仅仅是一个 TextBox,并每次验证 TextBox 是否包含您已经添加到控件文本中的字符串。

根据 MSDN 提供了一个名为 HashSet<T> 的类

HashSet 类提供高性能的集合操作。一套 是一个不包含重复元素的集合,并且其 元素没有特定的顺序。

因此,您可以检查通过剪贴板传递的字符串是否存在于文本框中,而不是检查它是否存在于 HashSet<string> 实例中

public partial class mainFrm : Form
{
    private HashSet<string> uniqueTexts = new HashSet<string>();
    public mainFrm()
    {
        InitializeComponent();
    }

    .....

    private void clipboardUpdater_Tick(object sender, EventArgs e)
    {
        string clipText = Clipboard.GetText();
        if (!uniqueTexts.Any(x => x.Equals(clipText, StringComparison.OrdinalIgnoreCase)))
        {
            clipboardSaveTextBox.AppendText("\n" + clipText);
            uniqueTexts.Add(clipText);
        }
    }

【讨论】:

    【解决方案3】:

    对我有用的是这个..

    我创建了一个计时器,将滴答间隔设置为 0.5 秒,因此它可以每 0.5 秒重复一次监控过程,我可以将其设置为 0.1 秒,但我不想让它变得沉重。

    然后我将它添加到方法中。

        private void clipboardUpdater_Tick(object sender, EventArgs e)
        {
            if (!clipboardSaveTextBox.Text.Contains(Clipboard.GetText()))
            {
                clipboardSaveTextBox.Text += "\n" + Clipboard.GetText();
            }
        }
    

    这是.. 如果 clipboardSaveTextBox.Text 不包含剪贴板的值,它将(+= 添加)剪贴板中存储的当前值到剪贴板SaveTextBox.Text。

    我希望我的回答能帮助其他可能遇到同样问题的人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-03
      • 2013-01-20
      • 1970-01-01
      • 2017-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多