C# 如何比较列表的列值

C# 如何比较列表的列值,c#,winforms,C#,Winforms,我有一个包含许多列的行列表。比如,一首歌是一行,专辑、艺术家、标题、年份是它的列。这些将显示在列表视图中。当我多重选择时,比如说5首歌曲,我需要检查艺术家是否对所有5首歌曲都相同。专辑、标题、年份也一样 我的伪代码如下: ListView.SelectedListViewItemCollection selectedItem = this.lvuFiles.SelectedItems; foreach (ListViewItem itemSelected in selectedItem) {

我有一个包含许多列的行列表。比如,一首歌是一行,专辑、艺术家、标题、年份是它的列。这些将显示在列表视图中。当我多重选择时,比如说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
}
我已经实现了检查相等性的方法。我只是不知道如何存储列表(标题列表、专辑列表等)并传递它们

编辑:


现在,我需要检查3个标题是否匹配。我想到的一种方法是将所有标题添加到列表中并传递给方法。对艺术家、专辑也要这样做。我无法获取selectedItems的值。因此,我必须维护多个属性的多个列表。还有更好的办法吗。至于给出的建议,我尝试了linq one。表示方法未定义。

您可以使用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是此类集合操作的朋友。

您可以使用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是此类集合操作的朋友

还有更好的办法吗

当然。首先,LINQ建议是完美的;唯一的问题是
ListView.SelectedItems
属性的类型没有实现
IEnumerable
;我猜这就是为什么它对你不起作用。您可以通过一个简单的
Cast
调用来解决此问题:

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);
}
然后在
列表视图上调用此方法。选择editems

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);
}
if(listView.SelectedItems.Count>0)
{
string firstTitle=listView.SelectedItems[0]。子项[titleColumn.Index]。文本;
谓词sameTitle=委托(对象obj)
{
如果(!(对象是ListViewItem))
{
返回false;
}
return((ListViewItem)obj).SubItems[titleColumn.Index].Text==firstTitle;
};
bool allSameTitle=All(listView.SelectedItems,sameTitle);
}
还有更好的办法吗

当然。首先,LINQ建议是完美的;唯一的问题是
ListView.SelectedItems
属性的类型没有实现
IEnumerable
;我猜这就是为什么它对你不起作用。您可以通过一个简单的
Cast
调用来解决此问题:

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);
}
然后在
列表视图上调用此方法。选择editems

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);
}
if(listView.SelectedItems.Count>0)
{
string firstTitle=listView.SelectedItems[0]。子项[titleColumn.Index]。文本;
谓词sameTitle=委托(对象obj)
{
如果(!(对象是ListViewItem))
{
返回false;
}
return((ListViewItem)obj).SubItems[titleColumn.Index].Text==firstTitle;
};
bool allSameTitle=All(listView.SelectedItems,sameTitle);
}