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
相关产品推荐
相关产品推荐

