【发布时间】:2015-07-03 14:29:01
【问题描述】:
这是我总体上想做的事情。需要明确的是,这不是家庭作业,也不是比赛或任何事情。希望我的措辞足够清楚:
问题
给定一组相同格式的字符串,但其中一些以小写字母结尾,而另一些不以小写字母结尾,则返回一组不以小写字母结尾但至少有一个相同的字符串以小写字母结尾的字符串。
示例
为简单起见,假设字符串格式为\d+[a-z]?,其中公共部分是数字。给定{1, 4, 3a, 1b, 3, 6c},我应该收到{1, 3} 的排列,因为 1 和 3 都有一个元素,末尾有和没有小写字母。
替代解决方案
我想到的一种方法是将集合划分为带和不带小写字母后缀的元素({1, 4, 3} 和{3a, 1b, 6c}),然后返回withoutSuffix.Where(x => withSuffix.Any(y => y.StartsWith(x)))。
我有两个问题:
-
我看不出用谓词
Regex.IsMatch(input, "[a-z]$")划分成两组的好方法。我想到的两个是两个定义相似的变量,每个变量都使用Where子句并对每个元素进行两次正则表达式匹配,或者转换集合以存储正则表达式匹配结果,然后从中形成两个变量。group...by当你需要像这样访问这两个集合时似乎玩得不好,但我可能错了。 -
虽然尺寸小到不关心性能,但每个
withoutSuffix元素通过withSuffix一次似乎不优雅。
相关解决方案
想到的另一种方法是获取公共前缀和可选后缀:{1 => {"", b}, 3 => {a, ""}, 4 => {""}, 6 => {c}}。这可以通过使用正则表达式 ((\d+)([a-z])?) 捕获前缀和后缀并将前缀按前缀分组到 grouped 中轻松实现。
从这里开始就好了:
where grouped.SomeButNotAll(x => x == string.Empty)
select grouped.Key
甚至:
where grouped.ContainsSomeButNotAll(string.Empty)
select grouped.Key
我当然可以创建其中任何一个,但不幸的是,我在 LINQ 中看到的最好的是:
where grouped.Contains(string.Empty) && grouped.Any(x => x != string.Empty)
select grouped.Key
感觉超级多余。在 LINQ 中还有什么比这更好的吗?
附:我愿意接受更好的方法来解决整体问题,而不是把它变成一个 XY 问题。优雅比性能更重要,但是(也许只是我)纯粹的浪费似乎仍然不优雅。
【问题讨论】: