1. 程式人生 > >c# ArrayList去重

c# ArrayList去重

注:
1.第一部分是昨天寫的,未深入探討Arraylist機制(雖然現在理解的也不多);
2.第二部分是今天在做完水準網間接平差後的操作。因為去重在網上沒找到合適的方案,於是自己做了實驗,簡單總結了下Arraylist的去重操作。嗯,還是稍微有點價值的(個人認為)。

第一部分:

平差時遇到了多條線路觀測同一個待定高程點的問題,那麼此時,待定點個數的確定,就得考慮下了。
讀取資料時,採用結構體存點,然後再新增到ArrayList中儲存。
儲存時,把每個觀測值的起點終點都記錄了下來,而待定高程點點名則要從裡面提取出來。

                //第一步,把所有待定高程點的起點、終點點名存到pointlistDaiDing中
                for (int i = 0
; i < Num.levelRoute; i++) { PointUnKnowH pointUnKnowH_read = (PointUnKnowH)pointlistUnKnow[i]; pointlistDaiDing.Add(pointUnKnowH_read.startPoint); pointlistDaiDing.Add(pointUnKnowH_read.endPoint); }

接下來,去除重複資料:

                //刪除重複資料
for (int i = 0; i < pointlistDaiDing.Count; i++) { for (int j = i + 1; j < pointlistDaiDing.Count; j++) { if (pointlistDaiDing[i].Equals(pointlistDaiDing[j])) { pointlistDaiDing.RemoveAt(j); if
(i > 0) { i--; } } } }

第二部分:

以上內容是昨天寫的,保留了草稿,那會兒確實是很糾結的。
但是,剛剛,我做出來那個水準網間接平差的了。
很高興啊。
遇到的很考驗演算法的知識點是:ArrayList去重

研究了下,總結了兩種情況:

1.兩項為完全相同

            //首先構造資料如下:
            for (int i = 0; i < 3; i++) {
                test a;
                a.name = "first";
                a.h = 100;
                pointlistNameH.Add(a);

                test a1;
                a1.name = "second";
                a1.h = 200;
                pointlistNameH.Add(a1);

                test a3;
                a3.name = "Third";
                a3.h = 100.5;
                pointlistNameH.Add(a3);
            }
            //然後去重,也就是 刪除重複資料
            for (int i = 0; i < pointlistNameH.Count; i++)
            {
                for (int j = i + 1; j < pointlistNameH.Count; j++)
                {
                    if (pointlistNameH[i].Equals(pointlistNameH[j]))
                    {
                        pointlistNameH.RemoveAt(j);
                        if (i > 0)
                        {
                            i--;
                        }
                    }
                }
            }

情況一執行效果如圖
情況一執行效果如圖

2.兩項只有部分欄位相同

此時進行去重操作時應採用相同的欄位作為判斷條件

            //首先,構造部分欄位相同的資料
            test a;
            a.name = "first";
            a.h = 100;
            pointlistNameH.Add(a);

            test a1;
            a1.name = "second";
            a1.h = 200;
            pointlistNameH.Add(a1);

            test a3;
            a3.name = "Third";
            a3.h = 100.5;
            pointlistNameH.Add(a3);

            test aa;
            a.name = "first";
            a.h = 100.5;
            pointlistNameH.Add(a);

            test aa1;
            a1.name = "second";
            a1.h = 200.3;
            pointlistNameH.Add(a1);

            test aa3;
            a3.name = "Third";
            a3.h = 101;
            pointlistNameH.Add(a3);
            for(int i=0;i<pointlistNameH.Count;i++){
                test test_read = (test)pointlistNameH[i];

            //先輸出下未去重的資料                                Console.WriteLine("Name:"+test_read.name+"\tH:"+test_read.h);
            }

            for (int i = 0; i < pointlistNameH.Count; i++)
            {
                test test_read = (test)pointlistNameH[i];
                for (int j = i + 1; j < pointlistNameH.Count; j++)
                {
                    test test_read2 = (test)pointlistNameH[j];
                    if (test_read.name == test_read2.name)
                    {
                        pointlistNameH.RemoveAt(j);
                        if (i > 0)
                        {
                            i--;
                        }
                    }
                }
            }

            //輸出下去重操作完成後的資料
            Console.WriteLine("-------------------------------------------------------------");

            for (int i = 0; i < pointlistNameH.Count; i++)
            {
                test test_read = (test)pointlistNameH[i];
                Console.WriteLine("Name:" + test_read.name + "\tH:" + test_read.h);
            }

情況二執行效果如圖
情況二執行效果如圖

後注:

先前敘述時為了突出問題解決方案,未做具體講述,在後面補充上。

首先,要宣告個結構體

    struct test {
        public string  name;
        public double h;

    }

然後,考慮到要把點位資訊進行儲存,於是聲明瞭Arraylist動態陣列,以方便後續操作。

    ArrayList pointlistNameH = new ArrayList();

這裡需要注意的是,使用 Arraylist需要新增引用如下:

    using System.Collections;

然後,就是上面的兩種情況的構造了。

放個Github下載連結?
算了,還沒用好呢,改天再來分享(chui)經驗(niu)吧。