2011-01-29 10 views
1

多くの列を持つ行のリストがあります。歌が行で、アルバム、アーティスト、タイトル、年が列であるといいます。これらはリストビューで表示されます。私が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 
} 

私は平等をチェックする方法を実装しました。私はちょうどリスト(タイトルリスト、アルバムリストなど)を保存し、それらを渡す方法を把握できませんでした。

EDIT:今

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

、私は3つのタイトルが一致したりしていないか確認する必要があります。私が考えた1つの方法は、すべてのタイトルをリストに追加してメソッドに渡すことでした。アーティスト、アルバムにも同じことをしてください。 selectedItemsの値を取得できませんでした。だから、私は複数のプロパティの複数のリストを維持する必要があります。より良い方法はありますか?与えられた提案に関しては、私はlinqを試しました。メソッドは定義されていません。

答えて

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. 

値を保持する方法の正確な構文はわかりませんが、うまくいけば翻訳できます。私は、あなたが本質的に求めているのは「すべての価値が同じである」ということに留意することだけです。リンクは、そのようなセット操作のためのあなたの友人です。

1

良い方法がありますか?

絶対に。 LINQの提案は、まずは完璧です。唯一の問題はListView.SelectedItemsプロパティのタイプがIEnumerable<ListViewItem>を実装していないことです。私はを推測していますそれはあなたのために働かなかったのです。あなたは、単純なCast<T>呼び出しでこの問題を解決することができますLINQの提案があなたのために動作しませんでした本当の理由は、あなたが.NET 2.0で立ち往生しているということであれば、今すぐ

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); 
} 

、恐れることはありません。この動作を引き続き汎用化できます。 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); 
} 
関連する問題