如何比较列表的列值

时间:2011-01-29 17:15:48

标签: c# winforms

我有一个包含许多列的行列表。比如,一首歌是一排,专辑,艺术家,标题,年份是它的专栏。它们显示在列表视图中。当我多选时,说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
}

我已经实现了检查相等性的方法。我无法弄清楚如何存储列表(标题列表,专辑列表等)并传递它们。

编辑:

Screenshot of List View http://i.min.us/iexmSg.png

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

2 个答案:

答案 0 :(得分:1)

  

有没有更好的方法。

绝对。对于初学者来说,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);
}

答案 1 :(得分:0)

您可以使用linq功能集运算符'All'。

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是您进行此类设置操作的朋友。