3

を持っていますIList<Animals> farmAnimals;

このリストには 3 つのタイプがあります。

  • ニワトリ

ラムダ クエリまたはlinq-to-objectsを使用してリストからすべてのニワトリを削除するにはどうすればよいでしょうか。ニワトリの別のリストがあり、元のリストには牛と羊しか含まれていません。

3 つのリスト (元のリストと新しい 2 つのリストをフィルター処理) を作成してから、元のリストを null にする必要がありますか? それとももっとトリッキーな方法がありますか?

結果は

IList<Aniamls> chickens;
IList<Animals> farmAnimals; // only contains the cows and sheep, now.

乾杯!

説明の質問:

よりパフォーマンスの高いものは何ですか?FindAll と RemoveAll と Where の提案との比較

4

4 に答える 4

3

仮定:

public abstract class Animal {}

public class Chicken : Animal {}

できるよ:

var chickens = animals.OfType<Chicken>().Cast<Animal>().ToList();

var nonChickens = animals.Except(chickens).ToList();

編集

妥当な答えはO(n)である必要があります。これは、元のリストの各項目が 1 回だけ処理されることを意味します。したがって、私は命令的なアプローチを提案します:

var chickens = new List<Animal>();
var nonChickens = new List<Animal>();

foreach(var animal in animals)
{
    var list = animal is Chicken ? chickens : nonChickens;

    list.Add(animal);
}
于 2009-01-14T01:47:13.067 に答える
2
var chickens = farmAnimals.Where(a => a.GetType() == typeof(Chicken)).ToList();
farmAnimals = farmAnimals.Where(a => a.GetType() != typeof(Chicken)).ToList();
于 2009-01-14T01:40:05.623 に答える
2
var chickens = farmAnimals.ToList().FindAll (c => c.Type == "Chicken");
farmAnimals.RemoveAll(a => a.Type=="Chicken");
于 2009-01-14T01:33:25.840 に答える
0

var Chickens = farmAnimals.FindAll(a=>a is Chicken);

私は可能な限り最も単純な解決策に動揺するひどい傾向があります. この場合、ラムダを使用するには .NET Framework 2.0 のみが必要です。LINQ 拡張メソッドには 3.5 が必要です。

于 2009-01-14T01:44:19.530 に答える