如何使用 List<object> 的 IndexOf() 方法

Posted

技术标签:

【中文标题】如何使用 List<object> 的 IndexOf() 方法【英文标题】:How to use IndexOf() method of List<object> 【发布时间】:2010-12-06 19:37:12 【问题描述】:

我在List&lt;T&gt; 中看到的所有使用IndexOf() 方法的示例都是基本字符串类型。我想知道的是如何根据其中一个对象变量返回作为对象的列表类型的索引。

List<Employee> employeeList = new List<Employee>();
employeeList.Add(new Employee("First","Last",45.00));

我想找到employeeList.LastName == "Something"所在的索引

【问题讨论】:

有没有办法在没有 lambda 表达式的情况下做到这一点?我被困在使用 .net 2.0 你能在下面使用我的解决方案吗? 【参考方案1】:
int index = employeeList.FindIndex(employee => employee.LastName.Equals(somename, StringComparison.Ordinal));

编辑:没有 C# 2.0 的 lambda(原始版本不使用 LINQ 或任何 .NET 3+ 功能,仅使用 C# 3.0 中的 lambda 语法):

int index = employeeList.FindIndex(
    delegate(Employee employee)
    
        return employee.LastName.Equals(somename, StringComparison.Ordinal);
    );

【讨论】:

我确认这样做可以。但是该项目不使用 Linq。我们正在使用 .NET 2.0 @Bay:您可以对匿名委托使用旧的(C# 3 之前的)语法,但只要您使用 C# 进行编译,我编写的原始语法就可以在 .NET 2 中找到3 编译器(C# 3.0 和 .NET 3.0 互不依赖)。【参考方案2】:
public int FindIndex(Predicate<T> match);

使用 lambda:

employeeList.FindIndex(r => r.LastName.Equals("Something"));

注意:

// Returns:
//     The zero-based index of the first occurrence of an element
//     that matches the conditions defined by match, if found; 
//     otherwise, –1.

【讨论】:

【参考方案3】:

你可以通过重写 Equals 方法来做到这一点

class Employee
    
        string _name;
        string _last;
        double _val;
        public Employee(string name, string last, double  val)
        
            _name = name;
            _last = last;
            _val = val;
        
        public override bool Equals(object obj)
        
            Employee e = obj as Employee;
            return e._name == _name;
        
    

【讨论】:

这是我们在第一个dotnet版本中所做的 这实际上是回答原始问题的唯一答案 - 如何将IndexOf() 与任何对象一起使用。其他人刚刚建议使用FindIndex() 代替......这没关系,但我认为这个答案应该得到更多的信任。【参考方案4】:

对不起,再来一个好办法:)

int index = employees.FindIndex(
      delegate(Employee employee)
        
           return employee.LastName == "Something";
        );

编辑:- .NET 2.0 项目中的完整示例。

class Program

    class Employee  public string LastName  get; set;  
    static void Main(string[] args)
    
        List<Employee> employeeList = new List<Employee>();
        employeeList.Add(new Employee()LastName="Something");
        employeeList.Add(new Employee()LastName="Something Else");
        int index = employeeList.FindIndex(delegate(Employee employee) 
                            return employee.LastName.Equals("Something"); );
        Console.WriteLine("Index:0", index);
        Console.ReadKey();
    

【讨论】:

是的,这满足了我的实际要求。我在 lambda 版本上为其他用户留下复选标记,因为他们可能正在使用 3.5。谢谢。 您的示例使用了仅在 C# 3 中才有的初始化语法。OP 没有明确区分他使用的是 C# 3 还是 C# 2,因此很难说出他想要什么。【参考方案5】:

我更喜欢这样的

    private List<Person> persons = List<Person>();

            public PersonService()
            
                persons = new List<Person>()  
                    new Person  Id = 1, DOB = DateTime.Today, FirstName = "Pawan", LastName = "Shakya" ,
                    new Person  Id = 2, DOB = DateTime.Today, FirstName = "Bibek", LastName = "Pandey" ,
                    new Person  Id = 3, DOB = DateTime.Today, FirstName = "Shrestha", LastName = "Prami" ,
                    new Person  Id = 4, DOB = DateTime.Today, FirstName = "Monika", LastName = "Pandey" ,
                ;
            

public PersonRepository.Interface.Person GetPerson(string lastName)
        
            return persons[persons.FindIndex(p=>p.LastName.Equals(lastName, StringComparison.OrdinalIgnoreCase))];
        

【讨论】:

【参考方案6】:

答案是让那些来这里的人知道为什么IndexOf() 不工作。

您的类必须覆盖objectEquals 方法拥有以下声明。

public override bool Equals(object obj)

【讨论】:

以上是关于如何使用 List<object> 的 IndexOf() 方法的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Linq 从 List<Object> 中获取第一个对象

如何使用提供程序将 List<object> 存储在 sharedpreferences 中?

如何使用 List<object> 将对象值添加到 viewmodel

如何将 List<Object> 转换为 List<MyClass>

java List<Object[]> 如何数据去重

list<String>如何转化为Map<String, Object>,list<EmpVO>如何转化为Map<String, Object>