在程式設計中時常遇到想要去操作某個list集合而又不想破壞原有list的情況。如果僅僅是新建乙個新list,將舊list的值賦值給新list的話,改變複製後的list,那麼原有的list也會變化,並沒有起到備份原始資料的作用,對於沒有巢狀的list,可以採用遍歷重新賦值的方法去賦值(傳遞的是值型別,並非引用型別),若list內的資料是乙個類的話,賦值的時候需要重新例項化才行。但如果是巢狀的list列表,遍歷這種方法就麻煩了很多。
拓展:c#中有兩種基本型別,它們分別是值型別和引用型別;其中類和陣列屬於引用型別。
因此,常見的對list進行複製轉殖的方法如下:
1、值型別集合的複製轉殖
private void test()
; listlis1 = lis; //結果["sss",2]
//方法一
listlis2 = new list();
lis.foreach(x=>lis2.add(x)); //結果[1,2]
//方法二
listlis3 = lis.toarray().tolist(); //結果[1,2]
//變化第乙個值
lis[0] = "sss";
}
2、引用型別集合的複製轉殖
[serializable]
public class people
public int age
}private void test()
, new people };
//方法一 copy peoples1 to peoples2
listpeoples2 = peoples1.convertall(x => ; });
//方法二
listpeoples3 = clone(peoples1) as list;
//方法三 需要引用newtonsoft.json.dll
listpeoples4= jsonconvert.deserializeobject>(jsonconvert.serializeobject(peoples1));
}
/// /// 得到乙個物件的轉殖(二進位制的序列化和反序列化)--需要標記可序列化
///
public static object clone(object obj)
根據相等比較器確定兩個序列是否相等。
1、值型別比較
/// /// 值型別集合比較
///
private void test()
; listlis2 = new list;
var c = lis1.sequenceequal(lis2); //結果 true
}
2、物件集合比較
//如果要比較序列中物件的實際資料而不是僅僅比較它們的引用,則必須在類中實現iequalitycomparer泛型介面
public class people:iequatable
public int age
public bool equals(people other)
}
/// /// 物件集合比較
///
private void test()
, new people };
listpeoples2 = new list, new people };
var b = peoples1.sequenceequal(peoples2); //true
}
Ceph RBD快照及分層(寫時複製轉殖)功能詳解
建立快照 rbd snap create rbd test snap test檢視快照 rbd snap ls rbd test snapid name size 4 snap test 2048 mb快照回滾 rbd snap rollback rbd test snap testps 回滾以後必...
linux下用dd命令拷貝硬碟,複製轉殖及還原硬碟
linux系統如果想做備份還原,使用ghost的時候經常出現問題,後來發現可以直接使用dd命令完成硬碟的轉殖和還原.當拷貝完硬碟後,就可以拿這個硬碟放到其它裝置上跑了。也就是完成了 燒寫 了。實際操作中,最好使用另乙個系統啟動,如另乙個硬碟的系統,或者用live cd。當然,拷貝當前執行中的系統也是...
Java位元組流檔案複製及效率比較
前兩種是不帶緩衝的的位元組流複製,後兩種是帶緩衝的位元組流複製,可以看出帶緩衝的位元組流複製的效率遠遠大於不帶緩衝的位元組流複製,而帶位元組陣列複製的效率也要比單個位元組複製的效率高。public static void main string args throws ioexception aut...