我如何才能找到一个项目的索引在一个列表中没有循环?

目前这看起来不太好-在列表中搜索相同的项两次,只是为了得到索引:

var oProp = something;

int theThingIActuallyAmInterestedIn = myList.IndexOf(myList.Single(i => i.Prop == oProp));

当前回答

如果有人想知道数组版本,它是这样的:

int i = Array.FindIndex(yourArray, x => x == itemYouWant);

其他回答

这一切都很好,但是如果您想选择一个现有元素作为默认值呢?在我的问题中,没有“——选择一个值——”选项。

这是我的代码——如果你不想检查没有结果,你可以把它变成一行代码……

private void LoadCombo(ComboBox cb, string itemType, string defVal = "")
{
    cb.DisplayMember = "Name";
    cb.ValueMember = "ItemCode";
    cb.DataSource = db.Items.Where(q => q.ItemTypeId == itemType).ToList();

    if (!string.IsNullOrEmpty(defVal))
    {
        var i = ((List<GCC_Pricing.Models.Item>)cb.DataSource).FindIndex(q => q.ItemCode == defVal);
        if (i>=0) cb.SelectedIndex = i;
    }
}

下面是IEnumerable的一个复制/粘贴扩展方法

public static class EnumerableExtensions
{
    /// <summary>
    /// Searches for an element that matches the conditions defined by the specified predicate,
    /// and returns the zero-based index of the first occurrence within the entire <see cref="IEnumerable{T}"/>.
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="list">The list.</param>
    /// <param name="predicate">The predicate.</param>
    /// <returns>
    /// The zero-based index of the first occurrence of an element that matches the conditions defined by <paramref name="predicate"/>, if found; otherwise it'll throw.
    /// </returns>
    public static int FindIndex<T>(this IEnumerable<T> list, Func<T, bool> predicate)
    {
        var idx = list.Select((value, index) => new {value, index}).Where(x => predicate(x.value)).Select(x => x.index).First();
        return idx;
    }
}

享受。

那名单呢?FindIndex方法:

int index = myList.FindIndex(a => a.Prop == oProp);

该方法执行线性搜索;因此,这种方法是一种 O(n)运算,其中n为Count。

如果未找到该项,则返回-1

对于简单类型,你可以使用"IndexOf":

List<string> arr = new List<string>();
arr.Add("aaa");
arr.Add("bbb");
arr.Add("ccc");
int i = arr.IndexOf("bbb"); // Returns 1.

如果有人想知道数组版本,它是这样的:

int i = Array.FindIndex(yourArray, x => x == itemYouWant);