0

List<T>親オブジェクトと子オブジェクトの両方を含むを使用しています。このリストでは、子オブジェクトは関連する親オブジェクトを認識しており、その逆も同様です。このリストを使用して、親が特定のタイプの場合に最大 4 つの子オブジェクトをリストから削除するビジネス ルールを実装しようとしています。別の言い方をすれば、このタイプの親に 20 個の子がある場合、そのうちの 4 個をリストから削除する必要があります。

ここで概説したコードはRemoveAll、条件を満たす子オブジェクトになります。これは予想どおりですが、私がやりたいのはRemoveAll、削除する子を 4 つだけに制限することです。これを行う手段はありRemoveAllますか、それとも使用すべき別の方法はありますか?

myList.RemoveaAll(item =>
  item.Child && "Foo".Equals(item.Parent.SpecialType));
4

5 に答える 5

5

Take拡張メソッドは、IEnumerable から最初の n 個の一致を取得するために使用されます。次に、一致を反復処理してリストから削除できます。

var matches = myList.Where(item => item.Child && "Foo".Equals(item.Parent.SpecialType)).Take(someNumber).ToList();
matches.ForEach(m => myList.Remove(m));
于 2009-12-11T19:03:17.157 に答える
2

どの4つでも構いませんか?そうでない場合は、 を使用.Take(4)して 4 つの子のリストを作成し、4 つを反復してRemove...

于 2009-12-11T19:04:07.000 に答える
1

これを試して:

int i = 0;
myList.Removeall(item =>
  item.Child && "Foo".Equals(item.Parent.SpecialType) && i++ < 4);

私はそれをテストしていませんが、動作するはずです。

于 2009-12-11T19:23:16.023 に答える
0

次のように、通常のリスト インターフェイスの上に構築する拡張メソッドを作成することもできます。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace App
{

    public static class ListExtension
    {
        public static int RemoveAll<T>(this List<T> list, Predicate<T> match, uint maxcount)
        {
            uint removed = 0;
            Predicate<T> wrappingmatcher = (item) =>
            {
                if (match(item) && removed < maxcount)
                {
                    removed++;
                    return true;
                }
                else
                {
                    return false;
                }
            };
            return list.RemoveAll(wrappingmatcher);
        }
    }

    public interface IHero { }
    public class Batman : IHero { }

    public class HeroCompilation
    {
        public List<IHero> Herolist;

        public HeroCompilation()
        {
            Herolist = new List<IHero>();
        }

        public void AddBatmans(int count){
            for (int i = 1; i <= count; i++) Herolist.Add(new Batman());
        }
    }

    class Program
    {
        static void ConsoleWriteBatmanCount(List<IHero> hero)
        {
            Console.WriteLine("There are {0} Batmans", hero.Count);
        }


        static void Main(string[] args)
        {
            HeroCompilation tester = new HeroCompilation();
            ConsoleWriteBatmanCount(tester.Herolist);
            tester.AddBatmans(10);
            ConsoleWriteBatmanCount(tester.Herolist);
            tester.Herolist.RemoveAll((x) => { return true; }, 4);
            ConsoleWriteBatmanCount(tester.Herolist);
            tester.Herolist.RemoveAll((x) => { return true; }, 4);
            ConsoleWriteBatmanCount(tester.Herolist);
            tester.Herolist.RemoveAll((x) => { return true; }, 4);
            ConsoleWriteBatmanCount(tester.Herolist);
            while (true) ;
        }
    }
}
于 2012-06-12T17:04:34.923 に答える
0

なぜTake機能を使用しないのですか?

于 2009-12-11T19:02:26.627 に答える