Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取数组中某个对象的索引,该对象的类型我们不知道_C#_Asp.net_Asp.net Mvc_List_Linq - Fatal编程技术网

C# 获取数组中某个对象的索引,该对象的类型我们不知道

C# 获取数组中某个对象的索引,该对象的类型我们不知道,c#,asp.net,asp.net-mvc,list,linq,C#,Asp.net,Asp.net Mvc,List,Linq,有一个“book”类型的值列表,还有一个“book”类型的对象。在执行函数之前,工作表和对象的类型是未知的,仅在流程中。当使用“indexOf()”方法时,它给出了索引-1,而不是3(当一个工作表和对象被类型“book”严格地键入时进行检查)。按照惯例,我有一个裸叶和一个裸对象,没有属性和变量。只有在执行之后,对象才能获得类型和值。正在进行中。这就是全部的困难 有什么问题吗 //Object with id = 4, has index 3 in the list obj = Connector

有一个“book”类型的值列表,还有一个“book”类型的对象。在执行函数之前,工作表和对象的类型是未知的,仅在流程中。当使用“indexOf()”方法时,它给出了索引-1,而不是3(当一个工作表和对象被类型“book”严格地键入时进行检查)。按照惯例,我有一个裸叶和一个裸对象,没有属性和变量。只有在执行之后,对象才能获得类型和值。正在进行中。这就是全部的困难 有什么问题吗

//Object with id = 4, has index 3 in the list
obj = Connector.Get(CurrentTable, "WHERE Id = " + id).FirstOrDefault();

//list with 10 records
var list = Connector.Get(CurrentTable, Condition).ToList();

//Need get 3, got -1
var currIndex = list.IndexOf(obj);
var nextIndex = (currIndex < list.Count - 1 ? currIndex : -1) + 1;
var prevIndex = (currIndex > 0 ? currIndex : list.Count) - 1;

ViewBag.NextPost = list[nextIndex];
ViewBag.PrevPost = list[prevIndex];
//id=4的对象在列表中有索引3
obj=Connector.Get(CurrentTable,“其中Id=“+Id”).FirstOrDefault();
//有10项记录的名单
var list=Connector.Get(CurrentTable,Condition).ToList();
//需要得到3,得到-1
var currendex=list.IndexOf(obj);
var nextIndex=(currendex0?currIndex:list.Count)-1;
ViewBag.NextPost=列表[nextIndex];
ViewBag.PrevPost=列表[prevIndex];

它正在比较对象引用。你需要做的不是直接平等。你能比较一个Id属性或其他东西来确定它们是否相等吗

//Object with id = 4, has index 3 in the list
obj = Connector.Get(CurrentTable, "WHERE Id = " + id).FirstOrDefault();

//list with 10 records
var list = Connector.Get(CurrentTable, Condition).ToList();

var currIndex = list
.Select((a, i) => new {element = a, index = i})
.First(a => a.element.Id == obj.Id)//or some other comparison that you would define as equal
.index;
var nextIndex = (currIndex < list.Count - 1 ? currIndex : -1) + 1;
var prevIndex = (currIndex > 0 ? currIndex : list.Count) - 1;

ViewBag.NextPost = list[nextIndex];
ViewBag.PrevPost = list[prevIndex];
//id=4的对象在列表中有索引3
obj=Connector.Get(CurrentTable,“其中Id=“+Id”).FirstOrDefault();
//有10项记录的名单
var list=Connector.Get(CurrentTable,Condition).ToList();
var currendex=list
.Select((a,i)=>new{element=a,index=i})
.First(a=>a.element.Id==obj.Id)//或您将定义为相等的其他比较
指数
var nextIndex=(currendex0?currIndex:list.Count)-1;
ViewBag.NextPost=列表[nextIndex];
ViewBag.PrevPost=列表[prevIndex];

如果您有任何类型的列表,如此

var list = Connector.Get(CurrentTable, Condition).ToList();
您可以将列表限制为“book”类型的对象,如下所示:

var books = list.OfType<book>().ToList();

IndexOf(obj)将不起作用。IndexOf需要一个能够将每个属性与每个实例进行比较的比较方法。我怀疑你有搜索方法。你是什么意思?什么是
连接器。获取
?显然,t不知道泛型(大约从2005年开始)和标识映射(许多数据层实现中的常见模式)。您正在尝试比较二进制对象。
a=>a.element.Id==obj.Id
。它不起作用,因为它看不到这些元素(运算符“.”不能应用于“lambda expression”类型的操作数)。按照惯例,我有一个裸叶和一个裸对象,没有属性和变量。只有在执行之后,对象才能获得类型和值。正在进行中。这就是全部difficulty@Zicise您的问题不完整,因为我们不知道涉及的类型。如果你想要一个解决你的具体问题的答案,请具体描述。
var foundBook = books.First( b => b.Id == obj.Id );