C# 选择方法使用Linq查找下面的一个和上面的一个

C# 选择方法使用Linq查找下面的一个和上面的一个,c#,asp.net-mvc,linq,C#,Asp.net Mvc,Linq,抱歉,如果问题标题可能会令人困惑。基本上,我在MVC中创建了一个列表,其中包含一个ID、int位置和一个字符串URL。使用列表,我希望能够创建上一个和下一个按钮,同时使用列表ID和位置来获取按钮链接 如果这没有意义,请让我知道 所以基本上,一旦你点击一个页面,就会有一个备选页面列表,位置将使用计数器创建,Id将代表页面Id,URL将用于按钮。我希望能够使用linq或c#语句来匹配当前页面Id和列表中的页面Id,但在使用position int值前后收集项目 这是我的模型 public Guid

抱歉,如果问题标题可能会令人困惑。基本上,我在MVC中创建了一个列表,其中包含一个ID、int位置和一个字符串URL。使用列表,我希望能够创建上一个和下一个按钮,同时使用列表ID和位置来获取按钮链接

如果这没有意义,请让我知道

所以基本上,一旦你点击一个页面,就会有一个备选页面列表,位置将使用计数器创建,Id将代表页面Id,URL将用于按钮。我希望能够使用linq或c#语句来匹配当前页面Id和列表中的页面Id,但在使用position int值前后收集项目

这是我的模型

public Guid Id { get; set; }
public int Position { get; set; }
public string Url { get; set; }
该模型被用作
列表

这就是我所想的开始

var selectedItem = overviewModel.Select(x => x.Id == PageId);
列表输出如下所示

[0] id=xxx1, position = 0, url = /1
[1] id=xxx2, position = 1, url = /2
[2] id=xxx3, position = 2, url = /3
[3] id=xxx4, position = 3, url = /4
假设我转到第页
[1]id=xxx2,position=1,url=/2

我想要通过的before值是
[0]id=xxx1,position=0,url=/1

我想要通过的after值是
[2]id=xxx3,position=2,url=/3

int index=myList.IndexOf(selectedItem);
        int index = myList.IndexOf(selectedItem);
        var prev = index > 0 ? myList[index - 1] : selectedItem;
        var next = index < myList.Count ? myList[index + 1] : selectedItem;
var prev=指数>0?myList[索引-1]:选择EdItem; var next=索引
您可以在按位置值排序的新列表上使用IndexOf方法来获取当前项目的索引,然后为下一个项目添加1或为上一个项目减去1:

List<overviewModel> sortedOverviewModelList = overviewModelList.OrderBy(item => item.Position).ToList();
overviewModel selectedItem = sortedOverviewModelList.Select(x => x.Id == PageId);
int index = sortedOverviewModelList.IndexOf(selectedItem);
int nextitem = index+1;
int previtem = index-1;
List-sortedoviewmodellist=overviewModelList.OrderBy(item=>item.Position.ToList();
概览模型selectedItem=sortedverviewmodellist.Select(x=>x.Id==PageId);
int index=sortedverviewmodellist.IndexOf(selectedItem);
int-nextitem=index+1;
int previitem=索引-1;

您应该添加一些检查,以确保索引仍在列表的范围内。

如果我理解正确,您需要以下内容:

var list = new List<overviewModel>();
list.Add(new overviewModel() { Id = Guid.NewGuid(), Position = 3, Url = "url" });
list.Add(new overviewModel() { Id = Guid.NewGuid(), Position = 1, Url = "url" });
list.Add(new overviewModel() { Id = Guid.NewGuid(), Position = 4, Url = "url" });
list.Add(new overviewModel() { Id = Guid.NewGuid(), Position = 2, Url = "url" });
list.Add(new overviewModel() { Id = Guid.NewGuid(), Position = 5, Url = "url" });

var PageId = list[2].Id;

var triple = list.Where(e => e.Id == PageId).SelectMany(e => new[] 
           {
               list.FirstOrDefault(q => q.Position == e.Position - 1), 
               e, 
               list.FirstOrDefault(q => q.Position == e.Position + 1)
           }).ToArray();
var list=newlist();
添加(新概览模型(){Id=Guid.NewGuid(),Position=3,Url=“Url”});
添加(新概览模型(){Id=Guid.NewGuid(),Position=1,Url=“Url”});
添加(新概览模型(){Id=Guid.NewGuid(),Position=4,Url=“Url”});
添加(新概览模型(){Id=Guid.NewGuid(),Position=2,Url=“Url”});
添加(新概览模型(){Id=Guid.NewGuid(),Position=5,Url=“Url”});
var PageId=list[2].Id;
var triple=list.Where(e=>e.Id==PageId)。选择many(e=>new[]
{
list.FirstOrDefault(q=>q.Position==e.Position-1),
E
list.FirstOrDefault(q=>q.Position==e.Position+1)
}).ToArray();
或者,如果某些位置可能会丢失

    var triple = list.Where(e => e.Id == PageId).SelectMany(e => new[] 
           {
               list.Where(q => q.Position < e.Position).OrderBy(q => q.Position).LastOrDefault(), 
               e, 
               list.Where(q => q.Position > e.Position).OrderBy(q => q.Position).FirstOrDefault()
           }).ToArray();
var triple=list.Where(e=>e.Id==PageId)。选择many(e=>new[]
{
list.Where(q=>q.Positionq.Position).LastOrDefault(),
E
list.Where(q=>q.Position>e.Position).OrderBy(q=>q.Position).FirstOrDefault()
}).ToArray();

因此,您将得到一个由3个概览模型项组成的数组:第一个是前一个(如果所选项是第一个,则为null),然后是所选项,然后是下一个项(如果所选项是最后一个,则为null)。

我认为您最好使用索引。为什么要强制使用linq?不一定是linqstatement@jsg哪个参数具有下一个<代码>和上一个<代码>的值?还有:列表是否按此参数排序?没有参数,下一个和上一个只需要url、位置和id@jsg好的,列表是按照您理解为
next
previous
的逻辑进行排序的。然后给出的答案应该适合你的情况。只有当他的列表按他理解为
next
previous
的值排序时,这才有效。只有当他的列表按他理解为next和previous的值排序时,这才有效。我更新了答案,以反映这样一个事实,即该类具有用于排序。我遇到的问题是indexOf行正在生成错误参数1:无法从“System.Collections.Generic.IEnumerable”转换为“NavigationViewModel”,请尝试指定显式类型。我编辑了答案以反映这些变化。您使用的列表类型似乎有问题。