c# ArrayList去重
阿新 • • 發佈:2019-02-14
注:
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)吧。