Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# NET中的多字符串_C#_.net_Delphi - Fatal编程技术网

C# NET中的多字符串

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

我怎样才能用与Delphi相同或几乎相同的方法来实现这一点,因为我知道.NET实际上没有像Delphi中那样的StringList的真正替代品

MultiStringList将StringList拆分为N个子StringList

例如:

你有一个文本,你想把它分成N个列表。或者,您可能需要将列表拆分为多个子列表

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行,其中每行表示一个字符串?然后检查方法。