我如何才能找到一个项目的索引在一个列表中没有循环?
目前这看起来不太好-在列表中搜索相同的项两次,只是为了得到索引:
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));
当前回答
EDIT:如果你只使用List<>并且你只需要索引,那么List. List。FindIndex确实是最好的方法。我将在这里为那些需要任何不同的答案(例如在任何IEnumerable<>之上)留下这个答案。
使用重载Select,它在谓词中接受一个索引,因此您将您的列表转换为(index, value)对:
var pair = myList.Select((Value, Index) => new { Value, Index })
.Single(p => p.Value.Prop == oProp);
然后:
Console.WriteLine("Index:{0}; Value: {1}", pair.Index, pair.Value);
或者如果你只想要索引并且你在多个地方使用它,你可以很容易地编写自己的扩展方法,就像Where,但它不是返回原始的项,而是返回那些与谓词匹配的项的索引。
其他回答
如果你不想使用LINQ,那么:
int index;
for (int i = 0; i < myList.Count; i++)
{
if (myList[i].Prop == oProp)
{
index = i;
break;
}
}
通过这种方式,您只迭代了一次列表。
那名单呢?FindIndex方法:
int index = myList.FindIndex(a => a.Prop == oProp);
该方法执行线性搜索;因此,这种方法是一种 O(n)运算,其中n为Count。
如果未找到该项,则返回-1
如果有人想知道数组版本,它是这样的:
int i = Array.FindIndex(yourArray, x => x == itemYouWant);
对于简单类型,你可以使用"IndexOf":
List<string> arr = new List<string>();
arr.Add("aaa");
arr.Add("bbb");
arr.Add("ccc");
int i = arr.IndexOf("bbb"); // Returns 1.
这一切都很好,但是如果您想选择一个现有元素作为默认值呢?在我的问题中,没有“——选择一个值——”选项。
这是我的代码——如果你不想检查没有结果,你可以把它变成一行代码……
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;
}
}