Delphi中有HashSet吗?

时间:2015-11-04 18:50:22

标签: delphi hashset

Delphi中是否有HashSet?

我知道使用set最多可以容纳255个项目。最新的Delphi编译器中是否有HashSet,例如XE8,西雅图

2 个答案:

答案 0 :(得分:13)

标准集合不提供通用集合类。第四方集合库,如Spring4D。

您可以在TDictionary<K, V>之上轻松构建通用集合类。裸骨版本可能如下所示:

type
  TSet<T> = class
  private
    FDict: TDictionary<T, Integer>;
  public
    constructor Create;
    destructor Destroy; override;
    function Contains(const Value: T): Boolean;
    procedure Include(const Value: T);
    procedure Exclude(const Value: T);
  end;

....

constructor TSet<T>.Create;
begin
  inherited;
  FDict := TDictionary<T, Integer>.Create;
end;

destructor TSet<T>.Destroy;
begin
  FDict.Free;
  inherited;
end;

function TSet<T>.Contains(const Value: T): Boolean;
begin
  Result := FDict.ContainsKey(Value);
end;

procedure TSet<T>.Include(const Value: T);
begin
  FDict.AddOrSetValue(Value, 0);
end;

procedure TSet<T>.Exclude(const Value: T);
begin
  FDict.Remove(Value);
end;

我没有编译此代码,因此您可能需要修复我所犯的任何错误。您可能希望将其扩展为更强大。但希望这可以告诉你如何开始。

答案 1 :(得分:1)

您可以使用Andy E。将public static class Helper { public static IEnumerable<Type> GetKnownTypes(ICustomAttributeProvider provider) { System.Collections.Generic.List<System.Type> knownTypes = new System.Collections.Generic.List<System.Type>(); Assembly[] loadedAssemblies = AppDomain.CurrentDomain.GetAssemblies(); Console.WriteLine("Registering known types..."); try { foreach (Assembly assembly in loadedAssemblies) { if (assembly.FullName.Contains("ESF.Runtime")) { foreach (var type in assembly.GetTypes()) { if (!type.FullName.Contains("GlobalsManager") && !type.FullName.Contains("AccessRight") && type.IsClass && (type.FullName.Contains("ESF.Runtime.BusinessObjects") || type.FullName.Contains("ESF.Runtime.RequestResponseManagement") || type.FullName.Contains("ESF.Runtime.MetadataObjects")) ) { knownTypes.Add(type); if (type.FullName.Contains("ESF.Runtime.BusinessObjects")) { MetadataManager.RegisterBusinessObjectType(type); MetadataManager.RegisterBusinessObjectTypeMappingToConfigurationObject(type); }; }; }; //break; }; }; } catch (Exception ex) { Debug.WriteLine(ex.InnerException.Message); }; return knownTypes; } 类型参数定义为要跟踪的内容。 private void simpleButton2_Click(object sender, EventArgs e) { try { var factory = new ChannelFactory<ESF.Runtime.ServiceContracts.IESFService>("wsHttpEndpointConfig"); var clientCredentials = new ClientCredentials(); clientCredentials.UserName.UserName = textEdit_UserName.Text; clientCredentials.UserName.Password = textEdit_UserPwd.Text; factory.Endpoint.Behaviors.Remove(typeof(ClientCredentials)); factory.Endpoint.Behaviors.Add(clientCredentials); GlobalsManager.ServiceClient = factory.CreateChannel(); GlobalsManager.ServiceClient.Login(); } catch (Exception ex) { MessageBox.Show(ex.InnerException.Message); }; } 类型参数可以是任何内容;你不会用它。 (Perl也没有 set 类型,所以约定是以我在这里建议的相同方式使用它的 hash 类型。)

致电question查看会员资格。使用TDictionaryContainsKey插入;要删除Add

编写一个隐藏未使用的at ESF.Runtime.ServiceContracts.Helper.GetKnownTypes(ICustomAttributeProvider provider) in d:\ServiceContracts\IESFService.cs:line 71 参数的包装器将是一项微不足道的工作。