【问题标题】:How to use IndexOf() method of List<object>如何使用 List<object> 的 IndexOf() 方法
【发布时间】: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
  • 你能在下面使用我的解决方案吗?

标签: c# list indexof


【解决方案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)
      

      【讨论】:

        猜你喜欢
        • 2018-01-15
        • 1970-01-01
        • 2022-07-11
        • 2016-06-24
        • 2019-03-28
        • 2011-10-01
        • 2023-01-22
        • 2014-06-15
        • 1970-01-01
        相关资源
        最近更新 更多