字符串单词搜索匹配问题:位置变化时无法正确识别相同单词
问题分析及解决方案
你的代码存在两个核心问题,导致无法正确识别不同位置的相同单词:
- 字符串分割错误:原字符串用
,(逗号加空格)分隔单词,但你用Split()默认按空格分割,会得到带逗号的错误单词(比如ірис,),导致Contains判断失效。 - 逻辑效率低下且不准确:遍历每个元素的单词再逐个检查是否在所有字符串中,不仅重复计算,还可能因为子串匹配出现误判。
修正后的代码
using System; using System.Collections.Generic; using System.Linq; class Garders { public string flower { get; set; } public Garders(string flowerStr) { flower = flowerStr; } } class Program { static void Main(string[] args) { Console.OutputEncoding = System.Text.Encoding.Unicode; Console.InputEncoding = System.Text.Encoding.Unicode; var gardenList = new List<Garders>() { new Garders("ірис, троянда, айстра, півонія, жоржин"), new Garders("ірис, троянда, айстра, півонія, жоржин, хризантема, гладіолус"), new Garders("ірис, троянда, айстра, півонія, гладіолус") }; // 将每个花园的花卉字符串转换为单词集合 var flowerSets = gardenList.Select(g => new HashSet<string>(g.flower.Split(new[] { ", " }, StringSplitOptions.RemoveEmptyEntries)) ).ToList(); // 计算所有集合的交集,即所有花园都存在的花卉 var commonFlowers = flowerSets.Aggregate((currentSet, nextSet) => { currentSet.IntersectWith(nextSet); return currentSet; }); // 输出结果 Console.WriteLine("所有花园共有的花卉:"); foreach (var flower in commonFlowers) { Console.WriteLine(flower); } } }
关键改进点
- 正确分割字符串:使用
,作为分隔符,配合StringSplitOptions.RemoveEmptyEntries去除空元素,确保得到干净的单词列表。 - 使用集合求交集:利用
HashSet的IntersectWith方法高效计算多个集合的交集,自动忽略单词位置,直接找出所有共同存在的单词。 - 简化逻辑结构:去掉冗余的枚举器操作,用LINQ简化集合转换和交集计算,代码更易读维护。
内容的提问来源于stack exchange,提问作者Exavi
相关产品推荐
相关产品推荐

