[英]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.