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++方法