我如何才能找到一个项目的索引在一个列表中没有循环?
目前这看起来不太好-在列表中搜索相同的项两次,只是为了得到索引:
var oProp = something;
int theThingIActuallyAmInterestedIn = myList.IndexOf(myList.Single(i => i.Prop == oProp));
我如何才能找到一个项目的索引在一个列表中没有循环?
目前这看起来不太好-在列表中搜索相同的项两次,只是为了得到索引:
var oProp = something;
int theThingIActuallyAmInterestedIn = myList.IndexOf(myList.Single(i => i.Prop == oProp));
当前回答
如果你不想使用LINQ,那么:
int index;
for (int i = 0; i < myList.Count; i++)
{
if (myList[i].Prop == oProp)
{
index = i;
break;
}
}
通过这种方式,您只迭代了一次列表。
其他回答
下面是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;
}
}
享受。
为List中的任何字符串值查找索引的简单解决方案。 下面是字符串列表的代码: int indexOfValue = myList。FindIndex(a => a. contains("从列表中插入值")); 在List中为任何整数值查找索引的简单解决方案。 下面是一个整数列表的代码: int indexOfNumber = myList。IndexOf(/* insert number from list */);
如果你不想使用LINQ,那么:
int index;
for (int i = 0; i < myList.Count; i++)
{
if (myList[i].Prop == oProp)
{
index = i;
break;
}
}
通过这种方式,您只迭代了一次列表。
这一切都很好,但是如果您想选择一个现有元素作为默认值呢?在我的问题中,没有“——选择一个值——”选项。
这是我的代码——如果你不想检查没有结果,你可以把它变成一行代码……
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;
}
}
如果有人想知道数组版本,它是这样的:
int i = Array.FindIndex(yourArray, x => x == itemYouWant);