2011-07-25 7 views
0

私は以下のようにlinqを使ってユーザコレクションからユーザを削除します。それをするのが良いですか?最初と2番目のクエリをマージできますか?Linqを使用してリストとフィルタコレクションをチェックします

List<int> userIDs = ConfigurationManager.AppSettings["users"].Split(',').Select(userId =>   Convert.ToInt32(userid)).ToList(); 

foreach (int userId in userIDs) 
{ 
    userInfoList.RemoveAll(user => (user.UserId.Equals(userId))); 
} 

UserInfoListは、ユーザーの集まりです。事前

+0

'userInfoList'にはすでにアイテムが設定されていて、それをフィルタリングしたいのですか、それともこれを初期化する際の一歩ですか? 1回のクエリでリストを一度に作成することができます。 –

+0

userInfoListが入力されます。 Petar Ivanovのソリューションを使用しました。これは、他のケースでは元のリストが必要になるためです。 – San

答えて

2

おかげでこれは、より効率的である:

HashSet<int> userIDs = new HashSet<int>(ConfigurationManager.AppSettings["users"].Split(',').Select(userId => Convert.ToInt32(userId))); 

userInfoList.RemoveAll(user => userIDs.Contains(user.UserId)); 

あなたが持っているn個のユーザーIDとuserInfoListでm個の要素内の要素ならば、あなたのソリューションは、O(n個×m個)です。 HashSetを使用すると、複雑さはO(n + m)になります。 (ハッシュテーブル操作が一定時間であると仮定して)。

+0

実際に 'user.UserId'は' int'型であるため、 'contains'を使うことができます(' userIds'は 'HashSet '型です)。 –

関連する問題