我有以下列表项,并尝试找出一个负责用户交互的算法。
tableItems.Add (new TableItem() {Start=1000, End=4000});
tableItems.Add (new TableItem() {Start=4000, End=6000});
tableItems.Add (new TableItem() {Start=6000, End=8000});
例如,在列表中,如果用户更改了第一个项目“结束”值,该值也会影响第二个列表项的“开始”值。那必须匹配。它就像一条链子。此外,如果用户想要更改第二项“开始”值,则第一项“结束”值也必须匹配。
解决这个连锁问题的有效方法是什么?
答案 0 :(得分:1)
void Main()
{
var rangeManager = new RangeManager();
rangeManager.SetRange(3, 6000, 9000);
rangeManager.GetRange(3).Dump();
rangeManager.SetRange(1, 500, 4000);
rangeManager.GetRange(1).Dump();
}
public class RangeManager
{
private List<int> _values;
public RangeManager()
{
_values = new List<int> { 0, 1000, 4000, 6000, 8000 };
}
public Range GetRange(int index)
{
// TODO check for index out of range
return new Range(_values[index], _values[index + 1]);
}
public void SetRange(int index, int start, int finish)
{
// TODO check for index out of range
// TODO make sure start less than finish
// TODO make sure start greater than previous value
// TODO make sure finish less than next + 1 value
_values[index] = start;
_values[index + 1] = finish;
}
}
public class Range
{
public int Start { get; private set; }
public int Finish { get; private set; }
public Range(int start, int finish)
{
Start = start;
Finish = finish;
}
}
要了解这里发生了什么,请从Range
课程开始。它只是Start
和Finish
的持有者。
接下来,查看RangeManager
课程。它封装了链式范围的管理。它将值(范围端点)保存在整数列表中(而不是Range
个对象列表)。这是存储数据的更好方法,因为在更新范围时不再需要更新相邻对象。另外,请注意,使用整数比使用字符串更好。 RangeManager
类还有一些方法可以帮助您操作和输出范围。
最后,看看Main
方法。这显示了如何使用RangeManager
并允许您测试它是否正常工作的示例。