当检查可以是字符串数组中的一个或多个项目时,如何将列表视图项目添加到数组中?

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&lt;ListViewItem&gt;().Where(x =&gt; x.SubItems.Cast&lt;ListViewItem.ListViewSubItem&gt;().Any(y =&gt; 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中项目网格中的选择范围之间的重叠

如何遍历数组中的多个字符串

当数组是C中的struct类型时,如何检查条目数组的第一个条目是不是为空?

选择多个用数组中的每个值替换一个单词