小编SOf*_*tic的帖子

NUnit比较两个列表

好吧所以我对单元测试相当新,到目前为止一切顺利.我在这里简化了我的问题,但基本上我有以下几点:

[Test]
public void ListTest()
{
    var expected = new List<MyClass>();
    expected.Add(new MyOtherClass());
    var actual = new List<MyClass>();
    actual.Add(new MyOtherClass());
    Assert.AreEqual(expected,actual);
    //CollectionAssert.AreEqual(expected,actual);
}
Run Code Online (Sandbox Code Playgroud)

但是测试失败了,不应该通过测试吗?我错过了什么?

c# nunit generic-list

20
推荐指数
4
解决办法
2万
查看次数

自定义成员提供者和统一依赖注入

我发现了一些与我发布的问题相似的问题,但我并没有从他们那里得到我真正需要的东西.我仍然在努力实现我的CustomMembershipProvider使用Microsoft Unity DI.

定制会员:

public class CustomMembershipProviderService : MembershipProvider
    {
        private readonly IUserService _userService;

        public CustomMembershipProviderService(IUserService userService)
        {
            this._userService = userService;
        }

        public override string ApplicationName
        {
        ...
Run Code Online (Sandbox Code Playgroud)

用户服务:

public class UserService : IUserService
    {
        private readonly IUserRepository _repository;
        private readonly IUnitOfWork _unitOfWork;
        public UserService(IUserRepository repository, IUnitOfWork unitOfWork)
        {
            this._repository = repository;
            this._unitOfWork = unitOfWork;
        }
        ...
Run Code Online (Sandbox Code Playgroud)

的AccountController:

public class AccountController : Controller
{
     // next line is what I don't feel too sure about what …
Run Code Online (Sandbox Code Playgroud)

dependency-injection unity-container repository-pattern custom-membershipprovider asp.net-mvc-3

8
推荐指数
1
解决办法
1863
查看次数

使用原始sql查询加载导航属性

我有这个SQL查询:

SELECT 
    t.ServerId, t.Id, s.Name
FROM 
    MyTable as t
JOIN 
    Server s ON t.ServerId = S.Id
Run Code Online (Sandbox Code Playgroud)

我正在运行它:

context.Database.SqlQuery<entity>("query_goes_here");
Run Code Online (Sandbox Code Playgroud)

如何配置EF以便它Server使用查询的返回数据加载我的实体的属性?

基于@octavioccl的答案,我最终做到了这一点:

foreach(var result in results)
{
    context.Attach(result);
    context.Entry(result).Reference(p => p.Server).Load();
}
Run Code Online (Sandbox Code Playgroud)

但是我担心这会造成很多数据库的旅行?

c# entity-framework-6

7
推荐指数
1
解决办法
3508
查看次数

foreach循环列出性能差异

在处理项目时,我遇到了以下代码,这引发了一个性能标志.

foreach (var sample in List.Where(x => !x.Value.Equals("Not Reviewed")))
{
    //do other work here
    count++;
}
Run Code Online (Sandbox Code Playgroud)

我决定运行几个快速测试,将原始循环与以下循环进行比较:

foreach (var sample in List)
{
    if (!sample.Value.Equals("Not Reviewed"))
    {
        //do other work here
        count++;
    }
}
Run Code Online (Sandbox Code Playgroud)

并把这个循环扔进去看看会发生什么:

var tempList = List.Where(x => !x.Value.Equals("Not Reviewed"));
foreach (var sample in tempList)
{
    //do other work here
    count++;
}
Run Code Online (Sandbox Code Playgroud)

我还用3种不同的方式填充了原始列表:50-50(所以50%的值"未经审核",其余为其他),10-90和90-10.这些是我的结果,第一个和最后一个循环大部分是相同的,但第二个循环要快得多,特别是在10-90的情况下.为什么呢?我一直认为Lambda表现很好.

编辑

count++实际上不是什么内循环,我只是说,这里出于演示的目的,我想我应该已经使用"//做的东西在这里"

表现结果

编辑2

结果每次运行1000次: 表现结果1000次

c# performance foreach lambda

5
推荐指数
1
解决办法
362
查看次数

WPF MVVM和TPL数据流中的进度条

我在遵循MVVM模式的WPF应用程序中使用TPL数据流.我有一个TransformBlock<object,object>ActionBlock<object>我一样,我将它们连接起来:

transformBlock.LinkTo(notificationBlock);
Run Code Online (Sandbox Code Playgroud)

ActionBlock<object>应更新我对当前进度视图的进度条,但UI似乎被冻结,只有当一切都完成处理更新.

我的CurrentProgress财产看起来像这样:

private double _CurrentProgress;

public double CurrentProgress
{
    get { return _CurrentProgress; }
    set
    {
        _CurrentProgress = value;
        RaisePropertyChanged("CurrentProgress");
    }
}
Run Code Online (Sandbox Code Playgroud)

并且我将它绑定到我的View,就像这样:

<ProgressBar Value="{Binding CurrentProgress, Mode=OneWay}" Name="uxProgressBar"/>
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?为什么TPL会阻止UI线程?

编辑

这就是我实例化TPL的方式:

foreach(var myObj in ObjList)
{
    transformBlock.Post(myObj);
}
Run Code Online (Sandbox Code Playgroud)

变换块:

TransformBlock<object, object>(
temp =>
{
    var response = ProcessRecord(temp);
    return response.Status;
},
new ExecutionDataflowBlockOptions
{
    MaxDegreeOfParallelism =20
});
Run Code Online (Sandbox Code Playgroud)

行动阻止:

ActionBlock<object>(
temp =>
{
    CurrentProgress = (double)temp.RecordNumber/(double)TotalRecords;
},
new ExecutionDataflowBlockOptions
{
    TaskScheduler …
Run Code Online (Sandbox Code Playgroud)

c# wpf mvvm task-parallel-library tpl-dataflow

5
推荐指数
1
解决办法
2036
查看次数

抽象工厂和控制反转在运行时解决

我有以下类和接口结构,我很难尝试让代码完成我需要的工作.

public interface IUserManager
{
    int Add(User user);
}

public class UserManagerA : IUserManager{}
public class UserManagerB : IUserManager{}
Run Code Online (Sandbox Code Playgroud)

在这个例子中,我使用Ninject作为IoC容器,但如果其他容器解决了这个问题,我可以更改它:

这是在我的内心NinjectWebCommon.cs:

void RegisterServices(IKernel kernel)
{
    string userRole = CurrentUser.Role;//this gets the user logged in
    //This is the part I do not how to do
    //I wish I could just type this in:
    kernel.Bind<IUserManager>().To<UserManagerA>()
        .When(userRole == "RoleA"); // this doesn't work obviously
    kernel.Bind<IUserManager>().To<UserManagerB>()
        .When(userRole == "RoleB"); // same doesn't work
}
Run Code Online (Sandbox Code Playgroud)

所有这一切,以便在我的(MVC)控制器中我可以这样做:

public class UserController
{
    private readonly IUserManager …
Run Code Online (Sandbox Code Playgroud)

c# asp.net-mvc dependency-injection ioc-container abstract-factory

4
推荐指数
1
解决办法
367
查看次数

nsubstitute收到调用特定对象参数

我有一个看起来像这样的类:

public myArguments
{
    public List<string> argNames {get; set;}
}
Run Code Online (Sandbox Code Playgroud)

在我的测试中,我这样做:

var expectedArgNames = new List<string>();
expectedArgNames.Add("test");

_mockedClass.CheckArgs(Arg.Any<myArguments>()).Returns(1);

_realClass.CheckArgs();

_mockedClass.Received().CheckArgs(Arg.Is<myArguments>(x => x.argNames.Equals(expectedArgNames));
Run Code Online (Sandbox Code Playgroud)

但测试失败并显示以下错误消息:

NSubstitute.Exceptions.ReceivedCallsException : Expected to receive a call matching:
    CheckArgs(myArguments)
Actually received no matching calls.
Received 1 non-matching call (non-matching arguments indicated with '*' characters):
    CheckArgs(*myArguments*)
Run Code Online (Sandbox Code Playgroud)

我猜它是因为.Equals()但我不知道如何解决它?

c# unit-testing nsubstitute

4
推荐指数
1
解决办法
3661
查看次数

Code First实体框架和外键

想象一下,我有一个由代码创建的数据库,看起来像这样.

Movie (table)
ID int PK
MoveiName nvarchar(100)

Actor (table)
ID int PK
ActorName nvarchar(100)
Movie_ID int FK
Run Code Online (Sandbox Code Playgroud)

这些是我会使用的模型,显然不完全是这样,但你会明白我的观点.

class Movie
{  
    int ID{get;set;}
    string MovieName {get;set;}
    List<Actor> Actors {get;set}
}

class Actor
{
    int ID{get;set}
    string Actorname{get;set}
    Movie Movie{get;set;}
    int Move_ID{get;set;}
}
Run Code Online (Sandbox Code Playgroud)

数据库首先使我能够从一个actor查询电影,但也允许我设置actor的forgien键属性来更新数据库.我不能在代码中首先执行此操作,因为外键在模型中不仅仅是对象.我不想获取Movie对象并设置属性,如果我知道我的电影的ID我宁愿只设置外键而没有调用来获取电影.

合理?大声笑

我想使用codefirst和实体迁移,但我想要与数据库相同的能力首先在对象上设置外键.

干杯的帮助:-D

c# database entity-framework

3
推荐指数
1
解决办法
9471
查看次数

BackgroundWorker 限制工人数量并在可用时创建它们

我有一个BackgroundWorker为列表中的每个对象创建一个的函数,我现在想要做的是将创建的工作人员数量限制为 20,并在他们完成后处理列表中的下一项。我正在考虑使用队列,并在处理工作人员之前检查队列大小是否小于 20,然后创建工作人员并将其添加到队列中。我的问题是如何在完成后从队列中删除该项目?以及如何设置循环以等待工作人员可用?

编辑 我想我已经接近了,这就是我现在所拥有的,但问题是程序卡在了while循环中:

var myObjectList = new List<myObject>();
myObjectList = PopulateList();
BackgroundWorker bgw;
foreach (var obj in myObjectList)
{
    bgw = new BackgroundWorker();
    while(BgwList.Count >= 20); //getting stuck here, why?
    BgwList.Add(bgw);
    if(!bgw.IsBusy)
    {
        bgw.RunWorkerAsync(obj);
    }
}
Run Code Online (Sandbox Code Playgroud)

BackgroundWorker完成后删除:

void BackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    BgwList.Remove((BackgroundWorker)sender); //verified that bgw is being removed from list
    //... other code
}
Run Code Online (Sandbox Code Playgroud)

c# multithreading backgroundworker

3
推荐指数
1
解决办法
3512
查看次数

将其转换为通用存储库模式

我已经开始将项目转换为通用存储库和工作单元模式.到目前为止,我已经能够将控制器中的所有直接上下文引用反向工程到通用存储库; 但是,我遇到以下两行代码的问题:

`context.Entry(ticket).Collection(i => i.TicketItems).Load();
            ticket.TicketItems.Clear();`
Run Code Online (Sandbox Code Playgroud)

这是我的控制器在删除a Ticket和a 之间的任何引用之前所做的事情TicketItem.之间存在许多一对多的关系TicketTicketItem.所以这些代码两行是什么,我在使用前删除所有TicketItems来自Ticket

entity-framework unit-of-work repository-pattern asp.net-mvc-3

2
推荐指数
1
解决办法
861
查看次数

在Visual Studio C中'〜'是什么意思/做什么

在线浏览一些代码时,我遇到了以下情况:

~Disposable()
{
   Dispose(false);
}
Run Code Online (Sandbox Code Playgroud)

这不会产生任何编译器错误,'〜'特别做什么或为什么会出现?

c# asp.net-mvc visual-studio-2010

1
推荐指数
1
解决办法
370
查看次数

在C#中的List中获取和设置对象的值

我有一个列表objects,我需要搜索列表中是否存在值,如果存在,我需要将object找到的属性之一设置为另一个值,是否可以在不搜索List两次的情况下执行此操作?(一次检查object列表中是否存在并且一次设置其值)

例如:

class myObject
{
   public string FieldNumber {get;set;}
   public string FieldValue  {get;set;}
}

var myValues = new List<myObject>();
myValues.Add(new myObject{ FieldNumber = "100A"});
myValues.Add(new myObject{ FieldNumber = "100B"});

var allValues = new List<myObject>();
allValues.Add(new myObject{ FieldNumber = "200A", FieldValue = "3"});
allValues.Add(new myObject{ FieldNumber = "100B", FieldValue = "C"});

foreach(var obj in allValues)
{
    GetAndSetField(myValues, obj.FieldNumber, obj.FieldValue);
}

void GetAndSetField(List<myObject> list, string fieldNumber, string fieldValue)
{
    var tempField = list.FirstOrDefault(x => …
Run Code Online (Sandbox Code Playgroud)

c# asp.net list

0
推荐指数
1
解决办法
4575
查看次数