当检查可以是字符串数组中的一个或多个项目时,如何将列表视图项目添加到数组中?
Posted
技术标签:
【中文标题】当检查可以是字符串数组中的一个或多个项目时,如何将列表视图项目添加到数组中?【英文标题】:How to add listviewitems to an array when the check can be one or more items in a string array? 【发布时间】:2021-08-17 06:47:34 【问题描述】:无论如何要删除三个条件并使用一个,问题是我可以有一个或多个数组长度,具体取决于字符串可以被空格分割多少次。
if (array.Length == 1)
list = FamilyDataItems.Cast<ListViewItem>()
.Where(x => x.SubItems
.Cast<ListViewItem.ListViewSubItem>()
.Any(y => y.Text.ToLowerInvariant().Contains(array[0])))
.ToArray();
else if (array.Length == 2)
list = FamilyDataItems.Cast<ListViewItem>()
.Where(x => x.SubItems
.Cast<ListViewItem.ListViewSubItem>()
.Any(y => y.Text.ToLowerInvariant().Contains(array[0])
&& y.Text.ToLowerInvariant().Contains(array[1])))
.ToArray();
else if (array.Length > 2)
list = FamilyDataItems.Cast<ListViewItem>()
.Where(x => x.SubItems
.Cast<ListViewItem.ListViewSubItem>()
.Any(y => y.Text.ToLowerInvariant().Contains(array[0])
&& y.Text.ToLowerInvariant().Contains(array[1])
&& y.Text.ToLowerInvariant().Contains(array[2])))
.ToArray();
【问题讨论】:
为什么不反过来做array.Contains(y.Text.ToLowerInvariant());
?那么array
中有多少项目并不重要。
var list = lv.Items.Cast<ListViewItem>().Where(x => x.SubItems.Cast<ListViewItem.ListViewSubItem>().Any(y => array.Contains(x.Text, StringComparer.OrdinalIgnoreCase)));
我已经尝试了上面的答案,问题是数组有较短的文本位,需要通过列表视图项找到。例如。数组有 "door", "double" 并且 listviewitem 字符串有 door_doubled-action,所以我需要检查 lvi 中是否既有门又有双。 HTH
【参考方案1】:
根据您上面的评论,是的 cmets 建议不会得到您所需要的。我认为以下会。
如果SubItem
应该包含数组中的任何单词:
void Caller()
foreach (var item in yourListView.Items.OfType<ListViewItem>())
item.BackColor = SystemColors.Window;
var array = new[] "door", "double" ;
var list = yourListView.Items.Cast<ListViewItem>()
.Where(x => x.SubItems.Cast<ListViewItem.ListViewSubItem>()
.Any(y => array
.Any(z => y.Text.IndexOf(z, StringComparison.OrdinalIgnoreCase) >= 0)));
foreach (var item in list)
item.BackColor = Color.Red;
或者如果SubItem
应该包含数组的所有单词:
void Caller()
foreach (var item in yourListView.Items.OfType<ListViewItem>())
item.BackColor = SystemColors.Window;
var array = new[] "door", "double" ;
var list = yourListView.Items.Cast<ListViewItem>()
.Where(x => x.SubItems.Cast<ListViewItem.ListViewSubItem>()
.Any(y => array
.All(z => y.Text.IndexOf(z, StringComparison.OrdinalIgnoreCase) >= 0)));
foreach (var item in list)
item.BackColor = Color.Red;
【讨论】:
这是我使用的答案,由 DR.Null 提供,因为它更小,并且在具有 256 位 bmp 图像的 4K 项目的秒表测试中大约需要 6 秒。我更改的唯一代码是将 yourListView.Items 更改为我存储的 listviewitems 数组。【参考方案2】:你可以试试这样的 -
list = FamilyDataItems.Cast<ListViewItem>()
.Where(
(array.Length == 1 && x => x.SubItems
.Cast<ListViewItem.ListViewSubItem>()
.Any(y => y.Text.ToLowerInvariant().Contains(array[0])))
|| (array.Length == 2 && x => x.SubItems
.Cast<ListViewItem.ListViewSubItem>()
.Any(y => y.Text.ToLowerInvariant().Contains(array[0])
&& y.Text.ToLowerInvariant().Contains(array[1])))
|| (array.Length > 2 && x => x.SubItems
.Cast<ListViewItem.ListViewSubItem>()
.Any(y => y.Text.ToLowerInvariant().Contains(array[0])
&& y.Text.ToLowerInvariant().Contains(array[1])
&& y.Text.ToLowerInvariant().Contains(array[2]))))
).ToArray();
HTH,我没有错过任何括号
【讨论】:
thanx Rajeev 它肯定比我的更紧凑。 很高兴认识弗兰克,如果对您有帮助,请您接受这个答案吗? 再次感谢 Rajeev,Null 博士这次拿到了横幅!以上是关于当检查可以是字符串数组中的一个或多个项目时,如何将列表视图项目添加到数组中?的主要内容,如果未能解决你的问题,请参考以下文章
如何将c#中的List转换为javascript中的数组并检查数组项
仅当数组有两个或多个带有 angularjs ng-show 的项目时,如何显示元素?
如何确定Javascript中项目网格中的选择范围之间的重叠