Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.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# 设计模式:解析文本文件中类似但不同的模式_C#_.net_Design Patterns_Architecture_Poker - Fatal编程技术网

C# 设计模式:解析文本文件中类似但不同的模式

C# 设计模式:解析文本文件中类似但不同的模式,c#,.net,design-patterns,architecture,poker,C#,.net,Design Patterns,Architecture,Poker,提前感谢你的帮助。我想知道是否有一种(设计)模式可以应用于这个问题 我希望从具有相似但不同格式的文本文件中解析、处理和提取值 更具体地说,我正在构建一个处理引擎,它接受来自多个不同网站的在线扑克手历史文件,并解析出特定的数据字段(手、日期时间、玩家)。对于每种格式,我需要解析文件的逻辑稍微不同,但是对提取值的处理是相同的 我的第一个想法是只创建一个类,它接受每种文件类型的“模式”,并相应地解析/处理。我相信有更好的解决办法 谢谢 加分: C#中的任何具体实现提示。您正在寻找的是“提供者”模式。。

提前感谢你的帮助。我想知道是否有一种(设计)模式可以应用于这个问题

我希望从具有相似但不同格式的文本文件中解析、处理和提取值

更具体地说,我正在构建一个处理引擎,它接受来自多个不同网站的在线扑克手历史文件,并解析出特定的数据字段(手、日期时间、玩家)。对于每种格式,我需要解析文件的逻辑稍微不同,但是对提取值的处理是相同的

我的第一个想法是只创建一个类,它接受每种文件类型的“模式”,并相应地解析/处理。我相信有更好的解决办法

谢谢

加分: C#中的任何具体实现提示。

您正在寻找的是“提供者”模式。。。它是ADO.Net中使用的。每个数据库供应商都有一个单独的数据“提供者”,该“提供者”知道如何从其特定的数据库供应商产品中读取数据,但以标准格式(接口)将数据交付给下游系统。。。您将编写一个小的“提供者”组件(一个类就足够了),该组件“知道”每个不同的网站扑克历史数据提供者的格式,并以完全相同的方式向读取该数据的上游系统公开该数据

首先,创建您的“在线扑克历史记录”模型。此模型将表示数据,并能够独立于源处理此数据。然后为必须能够将文件信息转换为模型的每个不同源格式创建提供程序

编辑:例如

public interface IDataProvider
{
    IOnlinePokerInfo ParseFileInformation(FileInfo input);
}

public interface IOnlinePokerInfo
{
    int Hand { get; set; }
    DateTime DateInfo { get; set; }
    List<IPlayer> Players { get; set; }
    void ProcessInformation();
}

public interface IPlayer
{
    string Name { get; set; }
}

public class MyOnlinePokerInfo : IOnlinePokerInfo
{
    private int hand;
    private DateTime date;
    private List<IPlayer> players;

    public int Hand { get { return hand; } set { hand = value; } }
    public DateTime DateInfo { get { return date; } set { date = value; } }
    public List<IPlayer> Players { get { return players; } set { players = value; } }

    public MyOnlinePokerInfo(int hand, DateTime date)
    {
        this.hand = hand;
        this.date = date;
        players = new List<IPlayer>();
    }

    public MyOnlinePokerInfo(int hand, DateTime date, List<IPlayer> players)
        : this(hand, date)
    {
        this.players = players;
    }

    public void AddPlayer(IPlayer player)
    {
        players.Add(player);
    }

    public void ProcessInformation()
    {
        Console.WriteLine(ToString());
    }

    public override string ToString()
    {
        StringBuilder info = new StringBuilder("Hand #: " + hand + " Date: " + date.ToLongDateString());
        info.Append("\nPlayers:");
        foreach (var s in players)
        {
            info.Append("\n"); 
            info.Append(s.Name);
        }
        return info.ToString();
    }
}

public class MySampleProvider1 : IDataProvider
{
    public IOnlinePokerInfo ParseFileInformation(FileInfo input)
    {
        MyOnlinePokerInfo info = new MyOnlinePokerInfo(1, DateTime.Now);
        IPlayer p = new MyPlayer("me");
        info.AddPlayer(p);
        return info;
    }
}

public class MySampleProvider2 : IDataProvider
{
    public IOnlinePokerInfo ParseFileInformation(FileInfo input)
    {
        MyOnlinePokerInfo info = new MyOnlinePokerInfo(2, DateTime.Now);
        IPlayer p = new MyPlayer("you");
        info.AddPlayer(p);
        return info;
    }
}

public class MyPlayer : IPlayer
{
    private string name;
    public string Name { get { return name; } set { name = value; } }

    public MyPlayer(string name)
    {
        this.name = name;
    }
}

public class OnlinePokerInfoManager
{
    static void Main(string[] args)
    {
        List<IOnlinePokerInfo> infos = new List<IOnlinePokerInfo>();

        MySampleProvider1 prov1 = new MySampleProvider1();
        infos.Add(prov1.ParseFileInformation(new FileInfo(@"c:\file1.txt")));

        MySampleProvider2 prov2 = new MySampleProvider2();
        infos.Add(prov2.ParseFileInformation(new FileInfo(@"c:\file2.log")));

        foreach (var m in infos)
        {
            m.ProcessInformation();
        }
    }
}
公共接口IDataProvider
{
IOnlinePokerInfo解析文件信息(文件信息输入);
}
公共接口IOnlinePokerInfo
{
int Hand{get;set;}
DateTime DateInfo{get;set;}
列出玩家{get;set;}
void ProcessInformation();
}
公共接口层
{
字符串名称{get;set;}
}
公共类MyOnlinePokerInfo:IOnlinePokerInfo
{
私人内勤;
私人日期时间日期;
私人名单玩家;
public int Hand{get{return Hand;}set{Hand=value;}}
public DateTime DateInfo{get{return date;}set{date=value;}}
公共列表玩家{get{return Players;}set{Players=value;}}
公共MyOnlinePokerInfo(整数手,日期时间日期)
{
这只手=手;
this.date=日期;
players=新列表();
}
公共MyOnlinePokerInfo(整数手牌、日期时间日期、球员名单)
:此(手,日期)
{
这个。玩家=玩家;
}
公共无效添加播放器(IPlayer播放器)
{
players.Add(player);
}
公共信息()
{
Console.WriteLine(ToString());
}
公共重写字符串ToString()
{
StringBuilder信息=新的StringBuilder(“Hand:”+Hand+“日期:”+Date.ToLongDateString());
信息附加(“\n层:”);
foreach(玩家中的var s)
{
信息附加(“\n”);
附加信息(s.名称);
}
return info.ToString();
}
}
公共类MySampleProvider1:IDataProvider
{
公共IOnlinePokerInfo解析文件信息(文件信息输入)
{
MyOnlinePokerInfo=新的MyOnlinePokerInfo(1,DateTime.Now);
IPlayer p=新的MyPlayer(“我”);
信息添加播放器(p);
退货信息;
}
}
公共类MySampleProvider2:IDataProvider
{
公共IOnlinePokerInfo解析文件信息(文件信息输入)
{
MyOnlinePokerInfo=新的MyOnlinePokerInfo(2,DateTime.Now);
IPlayer p=新的MyPlayer(“您”);
信息添加播放器(p);
退货信息;
}
}
公共类MyPlayer:IPlayer
{
私有字符串名称;
公共字符串名称{get{return Name;}set{Name=value;}}
公共MyPlayer(字符串名称)
{
this.name=名称;
}
}
公共类在线扑克信息管理器
{
静态void Main(字符串[]参数)
{
列表信息=新列表();
MySampleProvider1 prov1=新的MySampleProvider1();
infos.Add(prov1.ParseFileInformation(newfileinfo(@“c:\file1.txt”));
MySampleProvider2 prov2=新的MySampleProvider2();
infos.Add(prov2.ParseFileInformation(newfileinfo(@“c:\file2.log”));
foreach(infos中的var m)
{
m、 ProcessInformation();
}
}
}

这听起来像是战略模式的候选者。可以找到C#中的一个例子和另一个例子。有关简要说明,请访问

更完整的描述可在和的书中找到


它也可以从GoF书籍中获得。

听起来您需要策略模式,它允许您以多种不同的方式实现算法:


你也可以考虑使用一个动作来达到你需要处理的文件类型的时间。这样,您就可以灵活地处理所有格式,并遵守流程所需的一致参数

另一个好处是,您可以为每个新文件格式创建新操作,而无需重构其他格式的代码