为什么我的LINQ表达式中的FindIndex不起作用?

时间:2014-06-12 12:47:23

标签: c# linq

我的程序创建一个列表,用Person个对象填充它,并尝试查找与列表中第一个对象同名的 next 对象的索引。知道该特定索引的位置,程序可以将原始列表拆分为两个不同的列表。但是出于某种原因,当我期望它返回值为5时,LINQ表达式为splitLocation返回零。显然,我在LINQ表达式上做错了,或者我不理解我应该如何使用FindIndex。这是我的代码:

using System.Collections.Generic;
using System.Linq;

namespace NeedleInHaystack
{
    class Program
    {
        static void Main(string[] args)
        {
            // create the 'haystack'
            var people = new List<Person>();
            var person1 = new Person("Frank");
            var person2 = new Person("Jules");
            var person3 = new Person("Mark");
            var person4 = new Person("Allan");
            var person5 = new Person("Frank");
            var person6 = new Person("Greg");
            var person7 = new Person("Tim");
            people.Add(person1);
            people.Add(person2);
            people.Add(person3);
            people.Add(person4);
            people.Add(person5);
            people.Add(person6);
            people.Add(person7);

            // here's the 'needle'
            var needle = people[0].Name;

            var listA = new List<Person>();
            var listB = new List<Person>();

            // find the needle in the haystack
            var splitLocation = people.FindIndex(person => person.Name.Equals(needle));
            listA = people.Take(splitLocation).ToList();
            listB = people.Skip(splitLocation).ToList();
        }
    }

    public class Person
    {
        public Person(string name)
        {
            Name = name;
        }

        public string Name { get; set; }
    }
}

1 个答案:

答案 0 :(得分:6)

您正在寻找与第一个项目同名的 next 项目,但您并未跳过第一个项目!使用包含起始位置的FindIndex重载:

var splitLocation = people.FindIndex(1, person => person.Name.Equals(needle));

请注意,如果找不到匹配项,它将返回-1,因此您的Take会爆炸。