42

現在、私は次の構文を持っています(リストは、多くの異なるプロパティを持つオブジェクトを含むリストです(タイトルはそれらの1つです):

for (int i=0; i < list.Count; i++)
{
   if(title == list[i].Title)
   {
    //do something
   }
}

list[i].Titleコレクション全体をループせずに にアクセスするにはどうすればよいですか? リストは大きくなる傾向があるため、プログラムのパフォーマンスに影響を与える可能性があります。

プログラム全体で多くの同様の構文があります (for ループとインデックスによるパブリック プロパティへのアクセス)。しかし、これを行うためのより優れたエレガントな方法があるに違いないと確信していますか?

私のリストにはオブジェクトが含まれているため、find メソッドはオプションのようです。

4

10 に答える 10

63

正確には何を意味するのかわかりませんが、技術的に言えば、これはループなしでは不可能です。

たとえば、次のようなLINQを使用することを意味している可能性があります。

list.Where(x=>x.Title == title)

反復はスキップされず、単に LINQ クエリにラップされることに注意してください。

お役に立てれば。

編集

言い換えれば、パフォーマンスが本当に気になるなら、今までやってきた方法でコーディングを続けてください。それ以外の場合は、より簡潔で明確な構文を得るために LINQ を選択してください。

于 2012-05-08T12:13:29.233 に答える
40

ここにLinqが来ます:

var listItem = list.Single(i => i.Title == title);

述語に一致する項目がない場合、例外がスローされます。あるいは、 がありSingleOrDefaultます。

タイトルに一致するアイテムのコレクションが必要な場合は、次のものがあります。

var listItems = list.Where(i => i.Title ==  title);
于 2012-05-08T12:15:57.313 に答える
7

インデックスが必要ない場合は、条件の追加に使用する必要がありました

using System.Linq;

使用する

if(list.Any(x => x.Title == title){
// do something here
}

これにより、任意の変数が指定された条件を満たすかどうかがわかります。

于 2013-12-26T16:14:24.507 に答える
5

これらをハッシュテーブルに保存することをお勧めします。その後、キーを使用してコレクション内のアイテムにアクセスできます。これは、はるかに効率的なルックアップです。

var myObjects = new Hashtable();
myObjects.Add(yourObject.Title, yourObject);
...
var myRetrievedObject = myObjects["TargetTitle"];
于 2012-05-08T12:18:51.077 に答える
4

索引の作成を検討してください。辞書はトリックを行うことができます。リストのセマンティクスが必要な場合は、サブクラス化し、インデックスをプライベート メンバーとして保持します...

于 2012-05-08T12:17:29.377 に答える
2

ObservableCollection ではないハッシュ ベースのコレクション (Dictionary や Hashset など) を探しています。最善の解決策は、ハッシュ ベースのコレクションから派生させ、INotifyCollectionChanged を実装することです。これにより、ObservableCollection と同じ動作が得られます。

于 2012-05-08T12:16:58.927 に答える
2

ObservableCollection はリストであるため、要素の位置がわからない場合は、期待される要素が見つかるまで各要素を調べる必要があります。

最適化の可能性要素がソートされている場合は、バイナリ検索を使用してパフォーマンスを向上させます。それ以外の場合は、辞書をインデックスとして使用します。

于 2012-05-08T12:17:18.620 に答える
0

N 個のオブジェクトがあり、それらすべてのタイトルを取得する必要がある場合は、ループを使用する必要があります。タイトルのみが必要で、これを本当に改善したい場合は、タイトルのみを含む別の配列を作成できます。これにより、パフォーマンスが向上します。これがパフォーマンスを損なう可能性があると言う前に、使用可能なメモリの量と処理できるオブジェクトの量を定義する必要があります。いずれにせよ、解決策はアルゴリズムではなくプログラムの設計を変更することです。

于 2012-05-08T12:18:59.543 に答える