You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# TextBox输入值唯一性校验问题:末尾重复值无法检测

问题原因分析

问题的核心是换行符处理不规范导致的字符串不一致:

  • Windows平台下,TextBox的换行是\r\n(回车+换行)组合,而非单个\n。
  • 当你用new Char[] { '\n' }拆分时,前几行的末尾会保留\r字符(比如第三行的3会变成"3\r"),而最后一行的3因为没有后续换行,会被拆分为"3"。
  • 这两个字符串"3\r"和"3"被视为不同值,所以Distinct()后数组长度和原数组一致,不会触发重复提示。
  • 当最后一行加了5时,倒数第二行的3会被拆分为"3\r",和前一行的"3\r"重复,此时Distinct()能检测到重复。
解决建议

提供两种可靠的处理方案:

方案1:统一使用系统换行符拆分

直接用Environment.NewLine作为分隔符,匹配TextBox的实际换行格式:

string[] linesValues = textBoxValues.Text.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);

方案2:拆分后清理每个元素的空白字符

如果担心跨平台换行符差异,可以拆分后对每个元素做Trim()处理,去除首尾的空白字符(包括\r、空格等):

string[] linesValues = textBoxValues.Text.Split(new Char[] { '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries)
                                      .Select(line => line.Trim())
                                      .ToArray();

这种方式同时兼容\n、\r\n等多种换行格式,还能清理用户不小心输入的首尾空格。

校验逻辑优化(可选)

如果需要更严谨的校验,可以在清理后再做重复检查,确保逻辑更可靠:

var cleanedValues = textBoxValues.Text.Split(new Char[] { '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries)
                                    .Select(line => line.Trim())
                                    .Where(line => !string.IsNullOrEmpty(line))
                                    .ToArray();

if (cleanedValues.Distinct().Count() != cleanedValues.Count())
{
    MessageBox.Show("Question values must be unique!", "Duplicated values found", MessageBoxButtons.OK, MessageBoxIcon.Error);
    return;
}

内容的提问来源于stack exchange,提问作者Ilja Pahotin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 15:55:27