给定其属性的列表中的项目索引

Stu*_*urm 16 c# linq

MyList List<Person>有可能是Person与它的Name属性设置为"ComTruise".我需要该MyList列表中的索引.不是Person,只是它的索引.

我现在正在做的是:

string myName = ComTruise;
int thatIndex = MyList.SkipWhile(p => p.Name != myName).Count();
Run Code Online (Sandbox Code Playgroud)

如何更好地完成或使用IndexOf方法执行相同的任务?

Chr*_*ris 34

您可以使用FindIndex

string myName = "ComTruise";
int myIndex = MyList.FindIndex(p => p.Name == myName);
Run Code Online (Sandbox Code Playgroud)

注意:如果在列表中找不到与提供的谓词定义的条件匹配的项,则FindIndex返回-1.

  • 信息:如果未找到则返回-1 (3认同)

key*_*rdP 18

因为它是一个ObservableCollection,你可以试试这个

int index = MyList.IndexOf(MyList.Where(p => p.Name == "ComTruise").FirstOrDefault());
Run Code Online (Sandbox Code Playgroud)

-1如果您的收藏中不存在"ComTruise" ,它将返回.

正如评论中所提到的,这会执行两次搜索.您可以使用for循环优化它.

int index = -1;
for(int i = 0; i < MyList.Count; i++)
{
    //case insensitive search
    if(String.Equals(MyList[i].Name, "ComTruise", StringComparison.OrdinalIgnoreCase)) 
    {
        index = i;
        break;
    } 
}
Run Code Online (Sandbox Code Playgroud)

  • 而不是使用MyList.Where(..).FirstOrDefault())您可以使用MyList.FirstOrDefault(...)使代码更简单:) (2认同)

svi*_*ick 7

编写一个执行此操作的简单扩展方法可能是有意义的:

public static int FindIndex<T>(
    this IEnumerable<T> collection, Func<T, bool> predicate)
{
    int i = 0;
    foreach (var item in collection)
    {
        if (predicate(item))
            return i;
        i++;
    }
    return -1;
}
Run Code Online (Sandbox Code Playgroud)