C# NET中的多字符串
我怎样才能用与Delphi相同或几乎相同的方法来实现这一点,因为我知道.NET实际上没有像Delphi中那样的StringList的真正替代品 MultiStringList将StringList拆分为N个子StringList 例如: 你有一个文本,你想把它分成N个列表。或者,您可能需要将列表拆分为多个子列表C# NET中的多字符串,c#,.net,delphi,C#,.net,Delphi,我怎样才能用与Delphi相同或几乎相同的方法来实现这一点,因为我知道.NET实际上没有像Delphi中那样的StringList的真正替代品 MultiStringList将StringList拆分为N个子StringList 例如: 你有一个文本,你想把它分成N个列表。或者,您可能需要将列表拆分为多个子列表 unit Multi; interface uses System.SysUtils, System.Classes, System.Generics.Collectio
unit Multi;
interface
uses
System.SysUtils,
System.Classes,
System.Generics.Collections;
type
TMultiStringList = class
public
type
TFill = (mfiAdd, mfiClearBeforeFill);
TMode = (
mslTrim, // Trim lines before add
mslLower, // Lower lines before add
mslUpper, // Upper lines before add
mslAssign, // Just use Assign()
mslSpread); // Spread text to the lists
private
FLength: Integer;
FLists: TArray<TStringList>;
function ValidArray(): Boolean;
procedure BuildArray(const Length: Integer);
procedure FreeArray();
function GetList(const Index: Integer): TStringList;
public
constructor Create(const Length: Integer);
destructor Destroy(); override;
procedure LoadFromFile(const FileName: string; const Fill: TFill; const Mode: TMode);
property ListCount: Integer read FLength;
property Lists[const Index: Integer]: TStringList read GetList;
end;
implementation
{ TMultiStringList }
procedure TMultiStringList.BuildArray(const Length: Integer);
var
I: Integer;
begin
SetLength(FLists, Length);
for I := Low(FLists) to High(FLists) do
FLists[I] := TStringList.Create();
end;
constructor TMultiStringList.Create(const Length: Integer);
begin
FLength := Length;
BuildArray(Length);
end;
destructor TMultiStringList.Destroy;
begin
FreeArray();
inherited;
end;
procedure TMultiStringList.FreeArray;
var
I: Integer;
begin
if (Length(FLists) > 0) then
begin
for I := Low(FLists) to High(FLists) do
begin
FLists[I].Free();
FLists[I] := nil;
end;
SetLength(FLists, 0);
end;
end;
function TMultiStringList.GetList(const Index: Integer): TStringList;
begin
Result := FLists[Index];
end;
procedure TMultiStringList.LoadFromFile(const FileName: string; const Fill: TFill; const Mode: TMode);
procedure HandleLoad(Callback: TProc<TStringList, string>);
var
List, Target: TStringList;
I, J: Integer;
begin
List := TStringList.Create();
try
List.LoadFromFile(FileName);
for I := Low(FLists) to High(FLists) do
begin
if (Fill = TFill.mfiClearBeforeFill) then
FLists[I].Clear();
for J := 0 to List.Count - 1 do
Callback(FLists[I], List[J]);
end;
finally
List.Free();
end;
end;
procedure HandleAssign();
var
I: Integer;
begin
if (Fill = TFill.mfiClearBeforeFill) then
FLists[0].Clear();
FLists[0].LoadFromFile(FileName);
for I := 1 to High(FLists) do
begin
if (Fill = TFill.mfiClearBeforeFill) then
FLists[I].Clear();
FLists[I].Assign(FLists[0]);
end;
end;
procedure HandleSpread();
var
List: TStringList;
I: Integer;
ItemsPerList: Integer;
ListIndex: Integer;
begin
if (Fill = TFill.mfiClearBeforeFill) then
begin
for I := Low(FLists) to High(FLists) do
FLists[I].Clear();
end;
List := TStringList.Create();
try
List.LoadFromFile(FileName);
ItemsPerList := (List.Count + FLength - 1) div FLength;
for I := 0 to List.Count - 1 do
begin
FLists[I div ItemsPerList].Add(List[I]);
end;
finally
List.Free();
end;
end;
begin
if (not ValidArray()) then
raise Exception.Create('Array incomplete!');
case Mode of
mslTrim : HandleLoad(
procedure(Target: TStringList; S: string)
begin
Target.Add(Trim(S));
end);
mslLower : HandleLoad(
procedure(Target: TStringList; S: string)
begin
Target.Add(LowerCase(S));
end);
mslUpper : HandleLoad(
procedure(Target: TStringList; S: string)
begin
Target.Add(UpperCase(S));
end);
mslAssign : HandleAssign();
mslSpread : HandleSpread();
else
raise ENotImplemented.Create('Mode not implemented!');
end;
end;
function TMultiStringList.ValidArray: Boolean;
begin
Result := Length(FLists) = FLength;
end;
end.
unitmulti;
接口
使用
System.SysUtils,
系统,班级,,
系统、泛型、集合;
类型
TMultiStringList=类
公众的
类型
TFill=(mfiAdd,mfiClearBeforeFill);
TMode=(
mslTrim,//添加前修剪行
mslLower,//添加前降低行数
mslUpper,//添加前的上行
mslAssign,//只需使用Assign()
mslSpread);//将文本分散到列表中
私有的
长度:整数;
飞行物:柏油;
函数ValidArray():布尔值;
过程BuildArray(常量长度:整数);
过程FreeArray();
函数GetList(const Index:Integer):TStringList;
公众的
构造函数创建(常量长度:整数);
析构函数Destroy();推翻
过程LoadFromFile(常量文件名:字符串;常量填充:TFill;常量模式:TMode);
属性ListCount:整数读取长度;
属性列表[常量索引:整数]:TStringList read GetList;
结束;
实施
{TMultiStringList}
过程TMultiStringList.BuildArray(常量长度:整数);
变量
I:整数;
开始
设置长度(FLists,Length);
对于I:=低(FLists)到高(FLists)do
FLists[I]:=TStringList.Create();
结束;
构造函数TMultiStringList.Create(常量长度:整数);
开始
长度:=长度;
构建数组(长度);
结束;
析构函数TMultiStringList.Destroy;
开始
FreeArray();
继承;
结束;
程序TMultiStringList.FreeArray;
变量
I:整数;
开始
如果(长度(FLists)>0),则
开始
对于I:=低(FLists)到高(FLists)do
开始
FLists[I].Free();
FLists[I]:=nil;
结束;
设置长度(FLists,0);
结束;
结束;
函数TMultiStringList.GetList(常量索引:整数):TStringList;
开始
结果:=FLists[索引];
结束;
过程TMultiStringList.LoadFromFile(常量文件名:string;常量填充:TFill;常量模式:TMode);
过程HandleLoad(回调:TProc);
变量
列表,目标:TStringList;
一、 J:整数;
开始
列表:=TStringList.Create();
尝试
List.LoadFromFile(文件名);
对于I:=低(FLists)到高(FLists)do
开始
如果(Fill=TFill.mficlearbeforfill),则
FLists[I].Clear();
对于J:=0列出。计数-1 do
回调(FLists[I],List[J]);
结束;
最后
List.Free();
结束;
结束;
程序句柄符号();
变量
I:整数;
开始
如果(Fill=TFill.mficlearbeforfill),则
FLists[0]。清除();
FLists[0]。LoadFromFile(文件名);
对于I:=1到高(FLists)do
开始
如果(Fill=TFill.mficlearbeforfill),则
FLists[I].Clear();
FLists[I].赋值(FLists[0]);
结束;
结束;
程序HandleSpread();
变量
列表:TStringList;
I:整数;
ItemsPerList:整数;
ListIndex:整数;
开始
如果(Fill=TFill.mficlearbeforfill),则
开始
对于I:=低(FLists)到高(FLists)do
FLists[I].Clear();
结束;
列表:=TStringList.Create();
尝试
List.LoadFromFile(文件名);
ItemsPerList:=(List.Count+FLength-1)div FLength;
对于I:=0的列表。计数-1 do
开始
FLists[I div ItemsPerList].Add(列表[I]);
结束;
最后
List.Free();
结束;
结束;
开始
如果(不是ValidArray()),则
引发异常。创建('数组不完整!');
案例模式
mslTrim:手动加载(
过程(目标:TStringList;S:string)
开始
目标。添加(修剪);
(完),;
mslLower:手动加载(
过程(目标:TStringList;S:string)
开始
Target.Add(小写);
(完),;
mslUpper:手动加载(
过程(目标:TStringList;S:string)
开始
Target.Add(大写);
(完),;
mslAssign:HandleAssign();
mslSpread:HandleSpread();
其他的
raise ENotImplemented.Create('Mode not implemented!');
结束;
结束;
函数TMultiStringList.ValidArray:布尔值;
开始
结果:=长度(FLists)=长度;
结束;
结束。
二维字符串应该允许您实现类似的功能。如果您希望能够动态地向其中添加项目,您可以使用。我将这个问题理解为“有人请为我重新编写我的所有代码”。StackOverflow不可接受。@Jerrydoge不为true。没有人说“请”。你能解释更多关于什么和如何做的事情吗?(示例很有用)@Santos第一眼看上去很糟糕,因为你的问题很短,代码很长,即使你真的没有做错什么。@santosliveira,我同意。在这种情况下,您的代码与您的问题无关,因为在.NET中有更好的方法来解决此问题,但您无法知道这一点。因此,可以使用我在Delphi?中使用的1/3代码来完成。NET已经有许多内置类型和集合,允许您表示各种数据结构。根据您的要求和您试图实现的目标,可能会有更合适的数据类型。是的,但这将在子列表中将文本文件平均拆分为N行。因此,您想将文本拆分为N行,其中每行表示一个字符串?然后检查方法。