- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个简单的域对象:
class FavoriteFood
{
public string Name;
public int Ordinal;
}
我想要一个维护正确序数的域对象的集合。例如,给定 4 种最喜欢的食物:
Name: Banana, Ordinal: 1
Name: Orange, Ordinal: 2
Name: Pear, Ordinal: 3
Name: Watermelon, Ordinal: 4
如果我将 Pear 的序数更改为 4,它应该将 Watermelon 的序数降低为 3。
如果我添加一种新的最喜欢的食物(草莓),序数为 3,它应该将梨移至 4,将西瓜移至 5。
如果我将 Pear 的序数更改为 2,它应该将 Orange 移至 3。
如果我将西瓜的序数更改为 1,香蕉将增加到 2,橙色将增加到 3,而梨将增加到 4。
完成此任务的最佳方法是什么?
更新:域对象的名称属性是动态的并且基于用户输入。该对象必须具有此 Ordinal 属性,因为用户可以更改他们最喜欢的食物的显示顺序。此序数值保存在数据库中,在填充结构时,我无法保证按序号顺序添加项目。
我遇到的问题是,当底层域对象发生更改时,没有一种好的方法来更新列表中的其余项目。例如:
var favoriteFoods = new List<FavoriteFood>();
var banana = new FavoriteFood { Name = "Banana", Ordinal = 1};
favoriteFoods.Add(banana);
favoriteFoods.Add(new FavoriteFood { Name = "Orange", Ordinal = 2 });
banana.Ordinal = 2;
// at this point both Banana and Orange have the same ordinal in the list. How can we make sure that Orange's ordinal gets updated too?
到目前为止,我已尝试执行以下有效操作:
class FavoriteFood : INotifyPropertyChanging
{
public string Name;
public int Ordinal
{
get { return this.ordinal; }
set
{
var oldValue = this.ordinal;
if (oldValue != value && this.PropertyChanging != null)
{
this.PropertyChanging(new FavoriteFoodChangingObject { NewOrdinal = value, OldOrdinal = oldValue }, new PropertyChangingEventArgs("Ordinal"));
}
this.ordinal = value;
}
}
internal struct FavoriteFoodChangingObject
{
internal int NewOrdinal;
internal int OldOrdinal;
}
// THIS IS A TEMPORARY WORKAROUND
internal int ordinal;
public event PropertyChangingEventHandler PropertyChanging;
}
public class FavoriteFoodCollection : IEnumerable<FavoriteFood>
{
private class FavoriteFoodOrdinalComparer : IComparer<FavoriteFood>
{
public int Compare(FavoriteFood x, FavoriteFood y)
{
return x.Ordinal.CompareTo(y.Ordinal);
}
}
private readonly SortedSet<FavoriteFood> underlyingList = new SortedSet<FavoriteFood>(new FavoriteFoodOrdinalComparer());
public IEnumerator<FavoriteFood> GetEnumerator()
{
return this.underlyingList.GetEnumerator();
}
public void AddRange(IEnumerable<FavoriteFood> items)
{
foreach (var i in items)
{
this.underlyingList.Add(i);
}
}
IEnumerator IEnumerable.GetEnumerator()
{
return this.GetEnumerator();
}
private void UpdateOrdinalsDueToRemoving(FavoriteFood item)
{
foreach (var i in this.underlyingList.Where(x => x.Ordinal > item.Ordinal))
{
i.ordinal--;
}
}
public void Remove(FavoriteFood item)
{
this.underlyingList.Remove(item);
this.UpdateOrdinalsDueToRemoving(item);
}
public void Add(FavoriteFood item)
{
this.UpdateOrdinalsDueToAdding(item);
this.underlyingList.Add(item);
item.PropertyChanging += this.item_PropertyChanging;
}
private void item_PropertyChanging(object sender, PropertyChangingEventArgs e)
{
if (e.PropertyName.Equals("Ordinal"))
{
var ordinalsChanging = (FavoriteFood.FavoriteFoodChangingObject)sender;
this.UpdateOrdinalsDueToEditing(ordinalsChanging.NewOrdinal, ordinalsChanging.OldOrdinal);
}
}
private void UpdateOrdinalsDueToEditing(int newOrdinal, int oldOrdinal)
{
if (newOrdinal > oldOrdinal)
{
foreach (var i in this.underlyingList.Where(x => x.Ordinal <= newOrdinal && x.Ordinal > oldOrdinal))
{
//i.Ordinal = i.Ordinal - 1;
i.ordinal--;
}
}
else if (newOrdinal < oldOrdinal)
{
foreach (var i in this.underlyingList.Where(x => x.Ordinal >= newOrdinal && x.Ordinal < oldOrdinal))
{
//i.Ordinal = i.Ordinal + 1;
i.ordinal++;
}
}
}
private void UpdateOrdinalsDueToAdding(FavoriteFood item)
{
foreach (var i in this.underlyingList.Where(x => x.Ordinal >= item.Ordinal))
{
i.ordinal++;
}
}
}
这工作正常,但使用内部序数字段是一种奇怪的解决方法。它是必需的,这样 PropertyChangingEvent 就不会被无限引发。
最佳答案
只需使用 List<string>
:
List<string> foods = new List<string> { "Banana", "Orange", "Pear" };
int ordinalOfOrange = foods.IndexOf("Orange");
如果它必须改变您描述的方式,那么“存储”该序数不是一个好主意。
关于c# - 维护序数集合的正确顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6232081/
我需要定义 format为 date我的索引中的字段 { "mappings": { "properties": { "date": { "type": "da
我需要找到整数数组中元素的降序。 例子: 如果我有一个数组: x = {24, 55, 22, 1} 我想要一个 C 中的算法,它导致数组 order 其中: order = {2, 1, 3, 4}
我正在尝试用 Java 确定一个月中某个工作日的连续序号。即如果星期五是一个月的第一个或第三个星期五。 在阅读了我在 Java 日历上可以找到的所有内容和此处的帖子后,我找不到简单的方法。我能想到的一
我有一个关于 ordinal 的问题包裹在 R或者特别是关于 predict.clm()功能。我想计算linear predictor的 ordered probit估计。使用 MASS 包的 pol
一直提示输入 1 到 10 的数字 - 结果应将 st、rd、th 和 nd 添加到数字中。编写一个程序,提示用户输入 1 到 10 之间的任意整数,然后以序数形式显示该整数并附加后缀。 public
我有一个 D3 分组条形图,其中 x 轴使用我的 x0 比例形成,其中域作为数据值。由于域具有数据值,我的刻度文本也是相同的数据值。我想将刻度值更改为数据名称,保持比例不变,因为名称可以相同,但数据值
有没有办法使用 NSNumberFormatter 来获取 'th' 'st' 'nd' 'rd' 数字结尾? 编辑: 看起来它不存在。这是我正在使用的。 +(NSString*)ordinalNum
我想根据当天动态生成一串文本。因此,例如,如果是第 1 天,那么我希望我的代码生成 = "Its the 1*st*". 总共有 12 天,所以我做了以下事情: 我设置了一个循环 12 天的 for
ruby 或 rails 中是否有任何东西可以处理序数的格式:'1' 为 '1st','2' 为 '2nd',等等? 最佳答案 看起来你正在寻找序号: The Ruby on Rails framew
我是一名优秀的程序员,十分优秀!