我的程序创建一个列表,用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; }
}
}
答案 0 :(得分:6)
您正在寻找与第一个项目同名的 next 项目,但您并未跳过第一个项目!使用包含起始位置的FindIndex
重载:
var splitLocation = people.FindIndex(1, person => person.Name.Equals(needle));
请注意,如果找不到匹配项,它将返回-1
,因此您的Take
会爆炸。