繁体   English   中英

如何比较列表的列值

[英]How to compare column values of list

我有一个包含许多列的行列表。 假设一首歌是连续的,而专辑,艺术家,标题,年份则是专栏。 这些显示在列表视图中。 当我多选,比如说5首歌曲时,我需要检查艺术家是否对所有5首歌曲都相同。 专辑,标题,年份相同。

我的伪代码如下:

ListView.SelectedListViewItemCollection selectedItem = this.lvuFiles.SelectedItems;

foreach (ListViewItem itemSelected in selectedItem)
{
  // pass a list of 'title's to a method to check for equality
}

我已经实现了检查相等性的方法。 我只是不知道如何存储列表(标题列表,相册列表等)并通过它们。

编辑:

列表视图的屏幕快照http://i.min.us/iexmSg.png

现在,我需要检查3个标题是否匹配。 我认为的一种方法是将所有标题添加到列表中并传递给该方法。 对艺术家,专辑做同样的事情。 我无法获取selectedItems的值。 所以,我必须维护多个列表的多个属性。 有没有更好的办法。 至于给出的建议,我尝试了linq。 说,方法未定义。

有没有更好的办法。

绝对。 LINQ建议对于初学者来说是完美的; 唯一的问题是ListView.SelectedItems属性的类型未实现IEnumerable<ListViewItem> 这就是为什么它对您不起作用的原因。 您可以通过简单的Cast<T>调用来解决此问题:

if (listView.SelectedItems.Count > 0)
{
    var titles = from x in listView.SelectedItems.Cast<ListViewItem>()
                 select x.SubItems[titleColumn.Index].Text;

    string firstTitle = titles.First();
    bool allSameTitle = titles.All(t => t == firstTitle);
}

现在,如果LINQ建议对您不起作用的真正原因是您停留在.NET 2.0上,请不要担心。 您仍然可以泛化此行为。 定义一种方法来查看IEnumerable中的每个项目,并基于某些选择器功能确定它们是否均满足给定条件。 这是您可能如何做的一个例子:

public static bool All(IEnumerable source, Predicate<object> criterion)
{
    foreach (object item in source)
    {
        if (!criterion(item))
        {
            return false;
        }
    }

    return true;
}

然后,您可以在ListView.SelectedItems上这样调用此方法:

if (listView.SelectedItems.Count > 0)
{
    string firstTitle = listView.SelectedItems[0].SubItems[titleColumn.Index].Text;

    Predicate<object> sameTitle = delegate(object obj)
    {
        if (!(obj is ListViewItem))
        {
            return false;
        }

        return ((ListViewItem)obj).SubItems[titleColumn.Index].Text == firstTitle;
    };

    bool allSameTitle = All(listView.SelectedItems, sameTitle);
}

您可以使用linq功能集运算符“全部”。

using System.Linq;
...
var title = selectedItems.First().Column["Title"].Value;
var sameTitle = selectedItems.All(i => i.Column["Title"].Value == title);
// repeat for artist, album, year, etc.

我不知道如何获取这些值的确切语法,但希望您可以进行翻译。 我认为关键是要注意您本质上要问的是“所有值都相同”。 Link是您进行此类设置操作的朋友。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM