2
A
回答
2
Delphi RTL不包含實現不可變或只讀列表的類。你將不得不自己實現這樣一個類,或者找到一個提供這種功能的庫。
4
您可以使用Spring4D的IReadOnlyList<T>
。
如果你有一個IList<T>
你只需要調用AsReadOnlyList
並返回你相同的實例爲IReadOnlyList<T>
不提供方法來操作的列表(無Add
,Delete
或setter的Items
屬性)。
然而,有從Java到unmodifiableList
一個區別:
在Java中你真的得到了List<T>
這將引發UnsupportedOperationException
當您嘗試修改它,而在Spring4D這是.NET爲藍本,你得到的東西,你不能調用任何修改操作。
0
下面是一個簡單通用的不可變列表實現與地圖&過濾器支持:
unit Immutable;
interface
uses
System.Generics.Collections;
type
TFilter<TItem> = reference to function(AItem: TItem): Boolean;
TMapper<TItem> = reference to function(AItem: TItem): TItem;
IImmutableList<TItem> = interface
function Insert(Index: Integer; AItem: TItem): IImmutableList<TItem> ;
function Filter(AFilter: TFilter<TItem>): IImmutableList<TItem> ;
function Map(AMapper: TMapper<TItem>): IImmutableList<TItem> ;
function GetEnumerator: TEnumerator<TItem>;
end;
TImmutableList<TItem> = class(TInterfacedObject, IImmutableList<TItem>)
private
FList: TList<TItem>;
public
constructor Create(); overload;
constructor Create(AImmutableList: IImmutableList<TItem>); overload;
destructor Destroy; override;
function Insert(Index: Integer; AItem: TItem): IImmutableList<TItem>;
function Filter(AFilter: TFilter<TItem>): IImmutableList<TItem>;
function Map(AMapper: TMapper<TItem>): IImmutableList<TItem>;
function GetEnumerator: TEnumerator<TItem>;
end;
implementation
{ TImmutableList<TItem> }
constructor TImmutableList<TItem>.Create;
begin
FList := TList<TItem>.Create;
end;
constructor TImmutableList<TItem>.Create(AImmutableList: IImmutableList<TItem>);
var
AItem : TItem;
begin
FList := TList<TItem>.Create;
for AItem in AImmutableList do
FList.Add(AItem);
end;
destructor TImmutableList<TItem>.Destroy;
begin
FList.Free;
inherited;
end;
function TImmutableList<TItem>.GetEnumerator: TEnumerator<TItem>;
begin
Result := FList.GetEnumerator;
end;
function TImmutableList<TItem>.Insert(Index: Integer; AItem: TItem): IImmutableList<TItem>;
var
NewList : TImmutableList<TItem>;
begin
NewList := TImmutableList<TItem>.Create(Self);
TImmutableList<TItem>(NewList).FList.Insert(Index, AItem);
Result := NewList;
end;
function TImmutableList<TItem>.Filter(AFilter: TFilter<TItem>): IImmutableList<TItem>;
var
AItem : TItem;
NewList : TImmutableList<TItem>;
begin
NewList := TImmutableList<TItem>.Create();
for AItem in FList do begin
if AFilter(AItem) then
TImmutableList<TItem>(NewList).FList.Add(AItem)
end;
Result := NewList;
end;
function TImmutableList<TItem>.Map(AMapper: TMapper<TItem>): IImmutableList<TItem>;
var
AItem : TItem;
NewList : TImmutableList<TItem>;
begin
NewList := TImmutableList<TItem>.Create();
for AItem in FList do begin
TImmutableList<TItem>(NewList).FList.Add(AMapper(AItem))
end;
Result := NewList;
end;
end.
我使用它https://github.com/pierrejean-coudert/ReduxDelphi TodoMVC示例代碼。
相關問題
- 1. Delphi TList <T>泛型
- 2. 多線程中的Delphi TList
- 3. Delphi返回TList時出錯
- 4. 通用TLIST <IMyInterface的>在Delphi
- 5. 替換爲Delphi Prism中的TList。
- 6. 如何可以讀取一個從TList <> Delphi中
- 7. 刪除TList中的TList
- 8. 這是什麼?在Delphi中,「TList不包含名爲...」的成員
- 9. 使用tlist完整Delphi代碼中的內存泄漏
- 10. 在Delphi中使用多TList的方法XE5
- 11. 使用Delphi檢查字段是否爲TList
- 12. 如何使用Delphi一步初始化TList <T>?
- 13. EArgumentOutOfRangeException雖然沒有什麼改變TList
- 14. MutableDictionary變得不可變
- 15. Delphi:如何創建一個線程安全的全局TList?
- 16. TList <T> .count利用Delphi Mocks模擬返回值
- 17. 數組屬性,TList,TStringList或TCollection等(Delphi Win32)
- 18. Delphi中的泛型並返回對tlist的引用<class>
- 19. Reaffected div使jquery變得不可思議
- 20. 獲得由使用可變
- 21. 保存從TList
- 22. FileManager對於TinyMCE變得不可變
- 23. css3 3d變換,div變得不可用
- 24. 刪除值後;它變得不可變?
- 25. 清除TList或TObjectList
- 26. Delphi CommonAppDataFolder好像不可寫
- 27. Delphi字符串不可靠
- 28. FPC從TList專業化不支持
- 29. 如何修改TList <record>值?
- 30. 德爾福typcast tlist項目C++方法