【发布时间】:2021-11-26 02:43:59
【问题描述】:
我见过以不同方式提出的这个问题(检查列表是否包含某个字符串或字符串是否包含任何给定字符),但我需要其他内容。
我正在开发的程序与扑克有关,并以 [rank][suit] 格式显示扑克手牌列表,例如AhKd5h3c,在多个 DataGridViews 中。
现在,我有这个基本的文本框过滤器,它工作正常。
for (int i = 0; i < allFilteredRows.Count; i++)
{
allFilteredRows[i] = new BindingList<CSVModel>(allRows[i].Where
(x => x.Combo.Contains(txtHandFilter.Text)).ToList());
}
allFilteredRows 是我的 DataGridViews 的数据源。 allRows 是来自 SQL 数据库的未经过滤的手牌列表。 Combo 是个人扑克手。
不过,这只会过滤文本框中的确切字符序列。我想要的是单独过滤每个等级和西装。因此,如果用户键入“AK”,则应显示包含(至少)一张 A 和一张 K 的所有组合。如果输入是'sss',它应该过滤所有至少有三张黑桃的牌。字符的顺序无关紧要('KA' 等于 'AK'),但每个字符都需要包含在内,并且可以组合等级和套装,例如AKh 应该过滤出所有至少有一张 A 和红桃 K 的牌。
这超出了我对 LINQ 的了解,因此我将不胜感激。
【问题讨论】:
-
Enumerable.All是你的朋友。Where(r => txtHandFilter.Text.All(cardCh => r.Combo.Contains(cardCh))) -
所以我成功地完成了这样的工作。然而,问题是这并不能解释同一字符的多次出现。因此,“AA98”显示所有 A98* 手牌,“ssss”显示所有至少包含一把黑桃的手牌。
-
我认为这需要更多代码来处理,例如
5h5正确。看我的回答。另外,5h5应该匹配什么?h5h5应该匹配什么? -
另外,重复的卡片应该被忽略还是失败?例如
5h5h需要匹配两个5h还是只匹配一个? -
5h5 应该显示所有包含红桃 5 和任何花色 5 的手牌。 h5h5 理想地过滤了 5 颗心,再加上至少一颗额外的 5 和一颗额外的心,例如啊5h5s3d。 5hh 将是 5 颗红心加上至少一颗额外的红心。 5h5h 是不可能的,因为甲板上只有一个 5h,但我想可以忽略它。如果您有兴趣,这里是其他工具实现的附加语法:propokertools.com/simulations/generic_syntax 但这种方式超出了我目前所需要的。谢谢你的帮助!我现在看看你的答案。