我使用具有参数顺序(int)的对象来处理mini CMS。假设我有10个对象,每个对象都有从1到10之间的顺序。
我想把第三个元素移到第八个位置,所以3个元素应该得到位置(顺序)8,8元素被设置为7,7-6,6-5,所以是1.
反之亦然:如果我将8元素移动到2位置,那么8元素得到的顺序是2,2得到3,3得到4,所以在query.Coun之前
我写了一个弯曲的代码,当加载时,它是错误的,并产生一个与我想要的不同的结果。有人会遇到这样的问题吗教育..。
对不起,我的英语是我的代码:
public static void UpdateJsTreeOrder(this IDocumentSession session, string pageId, string parent, string element)
{
var pages = session.Query<Page>().Where(x => x.ParentPageId == parent);
var orderList = pages.Select(x => x.Order).Take(1024).ToList();
var page = session.Load<Page>(pageId);
if (element == null)
{
var subList = pages.Where(x => x.Order != page.Order).Take(1024).ToList();
foreach (var item in subList)
{
item.Order++;
session.Store(item);
}
page.Order = 1;
session.Store(page);
return;
}
var newOrder = session.Load<Page>(element).Order;
if (!orderList.Any())
{
//its the first item
}
//last item
if (newOrder == orderList.Max())
{
var subList = pages.Where(x => x.Order <= newOrder && x.Order != page.Order).Take(1024).ToList();
foreach (var item in subList)
{
item.Order--;
session.Store(item);
}
}
//first item
else if (newOrder == orderList.Min())
{
var subList = pages;
foreach (var item in subList)
{
item.Order--;
session.Store(item);
}
}
//int the middle
else
{
var subList = pages.Where(x => x.Order >= newOrder || x.Order == newOrder).Take(1024).ToList();
foreach (var item in subList)
{
item.Order--;
session.Store(item);
}
}
page.Order = newOrder;
session.Store(page);
}发布于 2017-03-25 03:28:55
如果您正在使用LINQ (似乎您正在工作),并且有一个您可以操作的集合,那么以下内容可能对您有用:
int oldOrder = 8;
int newOrder = 3;
if (newOrder < oldOrder) {
SmallBit moving = collection.Where(c => c.Order == oldOrder).First();
collection.Where(c => c.Order >= newOrder && c.Order < oldOrder).ToList().ForEach(c => c.Order += 1);
moving.Order = newOrder;
} else {
SmallBit moving = collection.Where(c => c.Order == oldOrder).First();
collection.Where(c => c.Order > oldOrder && c.Order <= newOrder).ToList().ForEach(c => c.Order -= 1);
moving.Order = newOrder;
}编辑:在本例中,SmallBit只是page对象--我在我的小提琴中重命名了它。
发布于 2017-03-26 01:05:08
我相信您可以使用这样的Insert和RemoveAt语句获得所需的结果
public static void UpdateJsTreeOrder(int from,int to)
{
var pages = new List<int>() {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
var item = pages.ElementAt(from);
pages.RemoveAt(from);
pages.Insert(to,item);
}这只是一个可以合并到代码中的示例。
发布于 2017-03-25 03:29:18
好吧,有三个(有效的)案例.
因此,为了解决每一种情况:
private void MoveItem(List<Page> source, int fromOrder, int toOrder)
{
if (fromOrder == toOrder)
{ return; }
if (fromOrder < toOrder)
{
foreach(Page page in source)
{
bool match = page.Order == fromOrder;
bool between = fromOrder < page.Order && page.Order <= toOrder;
page.Order = match ? toOrder :
between ? page.Order - 1 :
page.Order;
}
}
else
{
foreach(Page page in source)
{
bool match = page.Order == fromOrder;
bool between = toOrder <= page.Order && page.Order < fromOrder;
page.Order = match ? toOrder :
between ? page.Order + 1 :
page.Order;
}
}
}https://stackoverflow.com/questions/43011947
复制相似问题