Delphi中是否有HashSet?
我知道使用set最多可以容纳255个项目。最新的Delphi编译器中是否有HashSet,例如XE8,西雅图
答案 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查看会员资格。使用TDictionary
或ContainsKey
插入;要删除Add
。
编写一个隐藏未使用的at ESF.Runtime.ServiceContracts.Helper.GetKnownTypes(ICustomAttributeProvider provider) in d:\ServiceContracts\IESFService.cs:line 71
参数的包装器将是一项微不足道的工作。