【问题标题】:Get the index of an object in an array whose type we do not know获取数组中我们不知道其类型的对象的索引
【发布时间】:2019-01-22 19:16:06
【问题描述】:

有一个“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];

【问题讨论】:

  • IndexOf(obj) 将不起作用。 IndexOf 需要一个能够将每个属性与每个实例进行比较的比较方法。我怀疑你有搜索方法。
  • 什么意思?
  • 什么是Connector.Get?显然 t 不了解泛型(大约从 2005 年开始)和 Identity Map(许多数据层实现中的常见模式)。
  • 您正在尝试比较二进制对象。

标签: c# asp.net asp.net-mvc list linq


【解决方案1】:

它正在比较对象引用。除了直接平等之外,您还必须做一些事情。你能比较一个 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];

【讨论】:

  • a =&gt; a.element.Id == obj.Id。它不起作用,因为它看不到这些元素(运算符“。”不能应用于“lambda 表达式”类型的操作数)
  • 传统上,我有一个光秃秃的叶子和一个光秃秃的对象,没有属性和变量。只有在执行之后,对象才会获得类型和值。进行中。这就是全部的困难
  • @Zicise 您的问题不完整,因为我们不知道所涉及的类型。如果您想要解决特定问题的答案,请具体描述。 minimal reproducible example.
【解决方案2】:

如果你有任何类型的列表,比如这个......

var list = Connector.Get(CurrentTable, Condition).ToList();

您可以将列表限制为“book”类型的对象,如下所示:

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

过滤它也会转换它,因此您可以轻松比较属性。如果class book 有一个属性Id 并且您正在搜索与obj 匹配的书籍,您可以这样做:

var foundBook = books.First( b => b.Id == obj.Id );

【讨论】:

    猜你喜欢
    • 2017-03-26
    • 2013-04-25
    • 2023-01-19
    • 2021-01-04
    • 1970-01-01
    • 1970-01-01
    • 2019-10-19
    • 2012-02-21
    • 1970-01-01
    相关资源
    最近更新 更多