2010年4月6日火曜日

Listオブジェクトから特定のIndex(複数)をRemove

Listオブジェクトを使っていると、特定のIndexに相当する値を除去したくなる時があります。

単一のIndexならRemoveメソッドを使えば取り除けますが、複数の項目を同時にRemoveしようとするとうまくいきません。これはひとつの項目を除去するとListのIndexが更新されるので、次のIndexに相当する項目が変わってしまうからです。

Delegateを使ってRemoveAllメソッドを使えばできるようですが、私はこのDelegateがどうも苦手でダメなので、代わりに除去したListを返す関数を作ることで対応してます。

これってたぶん亜流なんでしょうね。



using System.Collections.Generic;
using System.Diagnostics;


namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            // Create Start List
            List<int> Ints = new List<int>();
            for (int i = 0; i < 100; i += 10)
            {
                Ints.Add(i);
            }
            
            //Create Delete Index List
            List<int> Deletes = new List<int>();
            Deletes.Add(2);
            Deletes.Add(4);


            // Do Delete
            List<int> result = DeleteFromIndex(Ints, Deletes);


            // Show Result
            foreach (int value in Ints)
            {
                Debug.WriteLine(value.ToString());
            }
            foreach (int value in result)
            {
                Debug.WriteLine(value.ToString());
            }


        }
        /// <summary>
        /// Delete values from index
        /// </summary>
        /// <param name="inList">Original List</param>
        /// <param name="inDeleteIndex">Index list for deletion</param>
        /// <returns>Deleted list</returns>
        private static List<int> DeleteFromIndex(List<int> inList,List<int> inDeleteIndex)
        {
            List<int> rt = new List<int>();


            for (int i = 0; i < inList.Count; i++)
            {
                if (!inDeleteIndex.Contains(i))
                {
                    rt.Add(inList[i]);
                }
            }
            return rt;
        }
    }
}

0 件のコメント: