C# 这可以用C语言简化吗?

C# 这可以用C语言简化吗?,c#,c#-5.0,code-duplication,C#,C# 5.0,Code Duplication,我有一些重复的代码,但不确定简化它的最佳方法 private void CheckData(long PKID, int ExpectedResult, string Server) { var a = _ARepo.GetAll(); var b = _BRepo.GetAll(); if(Server == "A") { a.Find(x => x.PKID == PKID).Result.ShouldBe(ExpectedResult

我有一些重复的代码,但不确定简化它的最佳方法

private void CheckData(long PKID, int ExpectedResult, string Server)
{
    var a = _ARepo.GetAll();
    var b = _BRepo.GetAll();

    if(Server == "A")
    {
        a.Find(x => x.PKID == PKID).Result.ShouldBe(ExpectedResultId);
    }

    if (Server == "B")
    {
        b.Find(x => x.PKID == PKID).Result.ShouldBe(ExpectedResultId);
    }
}

这是一个单元测试项目,我正在使用
库。任何想法都值得赞赏。

您可以制作一个助手方法来处理此重复:

private void CheckFind<T>(List<T> a, int expectedId) where T : IWithId {
    a.Find(x => x.PKID == PKID).Result.ShouldBe(expectedId);
}

是的,如果您可以使代码重构您的代码,并且您的
\u ARepo.GeAll
\u BRepo.getAll
在返回的类型中实现相同的接口,则如下所示

private void CheckData(long PKID, int ExpectedResult, string Server, IRepo repo)
{
    var b = repo.GetAll();  
    b.Find(x => x.PKID == PKID).Result.ShouldBe(ExpectedResultId);
}


如果两个
Repo
s实现相同的接口,更好的设计是将
IRepo
作为函数的参数。这样,函数只有一个角色,即检查数据(而不是决定要检查哪些数据)

使用一些简短的if符号,您可以使用以下命令 假设_ARepo和_BRepo来自同一类,但连接字符串不同

private void CheckData(long PKID, int ExpectedResult, string Server)
{
   BaseType repo = Server == "A" ? _ARepo : _BRepo;
   repo.GetAll().Find(x => x.PKID == PKID).Result.ShouldBe(ExpectedResultId);
}
假设它们不是相同的基类型,但GetAll()是IEnumerable

private void CheckData(long PKID, int ExpectedResult, string Server)
{
   IEnumerable<YourType> repo = Server == "A" ? _ARepo.GetAll() : _BRepo.GetAll();
   repo.Find(x => x.PKID == PKID).Result.ShouldBe(ExpectedResultId);
}
private void CheckData(长PKID、int ExpectedResult、字符串服务器)
{
IEnumerable repo=Server==“A”?\u ARepo.GetAll():\u BRepo.GetAll();
repo.Find(x=>x.PKID==PKID.Result.ShouldBe(ExpectedResultId);
}

如果所有回购协议实现相同的接口(如IRepo)。您可以像这样创建一个助手方法

    private IRepo GetRepo(string server)
    {
        var repos = new Dictionary<string, IRepo>
        {
            { "A", _ARepo },
            { "B", _BRepo }
        };

        return repos[server];
    }

a
b
的类型是什么?(服务器==“a”?a:b)。我想查找(…)。或者只需引入一个变量,并根据服务器为其分配a或b。然后在此变量上查询Find。@GiladGreen使用存储库模式和从SQL Server数据库中获取数据的
Dapper
,它们是相同的类型。在进行任何检查之前,从Repo a或Repo B获取数据不是更好吗?您只需要在此处获取一批数据。与其保存代码行,不如只访问一个存储库而不是两个存储库来提高性能。@Evk True。然而,分配一个变量需要两种类型相同,而我的方法可以很容易地调整为泛型类型的列表,并有一个获取ID的接口。@Servy如果可以使用
IEnumerable
,这将是正确的。但是,使用
Find
表明OP使用
List
,因此不,您的技巧不会起作用。如果在_ARepo和_breponted之间没有隐式转换,则不能将隐式var与条件运算符一起使用,但很容易计算出x)Repo的类型与
相同
如果你只看一下代码的结构,连接字符串只会对服务器“A”和服务器“B”有所不同,但是我已经更新了我的答案,以涵盖相同的情况,如果答案不一样,我会根据你的建议将方法更改为
private void CheckData(长PKID,int ExpectedResult,Repository repo)
@MarkAllison-很高兴能帮上忙:)顺便说一句-如果已经在写UT并且更好地负责代码段,那么我建议使用一个
IRepository
,而不是一个具体的
Repository
:)签出-这是编写代码和制作艺术之间的一种区别:)
private void CheckData(long PKID, int ExpectedResult, string Server)
{
   BaseType repo = Server == "A" ? _ARepo : _BRepo;
   repo.GetAll().Find(x => x.PKID == PKID).Result.ShouldBe(ExpectedResultId);
}
private void CheckData(long PKID, int ExpectedResult, string Server)
{
   IEnumerable<YourType> repo = Server == "A" ? _ARepo.GetAll() : _BRepo.GetAll();
   repo.Find(x => x.PKID == PKID).Result.ShouldBe(ExpectedResultId);
}
    private IRepo GetRepo(string server)
    {
        var repos = new Dictionary<string, IRepo>
        {
            { "A", _ARepo },
            { "B", _BRepo }
        };

        return repos[server];
    }
    private void CheckData(long PKID, int ExpectedResultId, string Server)
    {
        var repo = GetRepo(Server);
        repo.GetAll().Find(x => x.PKID == PKID).Result.ShouldBe(ExpectedResultId);
    }