簡體   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