首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#更改同一类别中所有兄弟类对象的顺序和顺序

C#更改同一类别中所有兄弟类对象的顺序和顺序
EN

Stack Overflow用户
提问于 2017-03-25 02:42:40
回答 3查看 89关注 0票数 0

我使用具有参数顺序(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之前

我写了一个弯曲的代码,当加载时,它是错误的,并产生一个与我想要的不同的结果。有人会遇到这样的问题吗教育..。

对不起,我的英语是我的代码:

代码语言:javascript
复制
 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);
    }
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-03-25 03:28:55

如果您正在使用LINQ (似乎您正在工作),并且有一个您可以操作的集合,那么以下内容可能对您有用:

代码语言:javascript
复制
    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对象--我在我的小提琴中重命名了它。

票数 1
EN

Stack Overflow用户

发布于 2017-03-26 01:05:08

我相信您可以使用这样的Insert和RemoveAt语句获得所需的结果

代码语言:javascript
复制
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);
        }

这只是一个可以合并到代码中的示例。

票数 1
EN

Stack Overflow用户

发布于 2017-03-25 03:29:18

好吧,有三个(有效的)案例.

  • 物品不动
  • 项目移动到更大的订单,减少其他项目的空间。
  • 项目移动到一个较小的订单,增加其他项目以腾出空间。

因此,为了解决每一种情况:

代码语言:javascript
复制
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;
    }
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43011947

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档