c# - 我们如何将当前属性分配为等于新参数,然后在新值被关联时将其删除?
问题描述
测试应该检查火车何时被分配到他失去前一条线路的线路。Train 类应按照以下步骤在函数 public void AssignTo(ILine l) 中实现此测试(需要遵守它们):
- 当前任务
= l1
l1.Trains
包含THIS
- 需要
THIS
从l1.trains
- 需要更改当前线路并将火车添加到新线路
internal class Train : ITrain
{
internal Train(string name, Company company)
{
this.Name = name;
this.Company = company;
}
public string Name
{
get;
}
public ICompany Company
{
get;
}
public ILine Assignment
{
get;
private set;
}
public void AssignTo(ILine l)
{
//Current assignment = l1
var l1 = Assignment;
//l1,Trains contains THIS
this.AssignTo(l1.train)
//need to remove THIS from l1.trains
((List<Train>)l1.Trains).Remove(this);
//need to change current line and add train to new line
((List<Train>)l.Trains).Add(this);
Assignment = l;
}
}
}
[Test]
public void T2_when_a_train_is_assigned_to_a_line_he_losts_its_previous_line()
{
ICity s = CityFactory.CreateCity("Paris");
ICompany c = s.AddCompany("SNCF");
ILine l1 = s.AddLine("RER A");
ILine l2 = s.AddLine("RER B");
ITrain t1 = c.AddTrain("RER1");
t1.AssignTo(l1);
t1.Assignment.Should().BeSameAs(l1);
t1.AssignTo(l2);
t1.Assignment.Should().BeSameAs(l2);
l1.Trains.Count().Should().Be(0);
l2.Trains.Single().Should().BeSameAs(t1);
}
解决方案
您当前接口的问题在于ILine.Trains
,IEnumerable
您无法真正从IEnumerable
. 在您的代码中,您假设它始终是 a List
,您不应该这样做,但是如果您不能更改类型,ILine.Trains
那么我想这是唯一的方法。
无论如何,您的代码不起作用的原因是您AssignTo
出于某种原因递归调用。您应该删除此调用:
public void AssignTo(ILine l)
{
var l1 = Assignment;
// remove this line
// this.AssignTo(l1.train)
((List<Train>)l1.Trains).Remove(this);
((List<Train>)l.Trains).Add(this);
Assignment = l;
}
虽然这不是必需的(这似乎是您的要求之一),但您需要先检查是否l1.Trains
包含this
:
var l1 = Assignment;
if (l1.Trains.Contains(this)) {
((List<Train>)l1.Trains).Remove(this);
}
((List<Train>)l.Trains).Add(this);
Assignment = l;
推荐阅读
- python - Django如何对字典列表进行分页
- r - 创建一个新列并对来自 2 个数据集的数据进行分类
- sql - 如何丢弃/忽略存储过程的许多返回值之一
- string - 在 VS2017 中使用 VS2005 字符串实现
- java - Android 活动问题 startActivity(我只想显示)
- bash - 如何使用 bash 字符串格式化来反转日期格式?
- c# - 如何在少于线性的时间内获得 ImmutableQueue 的大小
- sql - SQL 一对多关系表设计,正确的方法
- symfony - Symfony 总是在我的自定义控制台命令中抛出 OptimisticLockException
- google-sheets - 合并两个数据集以添加缺失数据的默认值