我正在寻找一种方法来从列表中的关键字搜索中获取列表中所有元素的索引。例如,我的列表有:
Hello World
Programming Rocks
Hello
Hello World
I love C#
Hello
现在从这个字符串列表中,我想获得所有表示Hello World的元素索引。我尝试了以下但它只返回它找到的第一个具有我的搜索条件的索引:
for (int i = 0; i< searchInList.Count; i++)
foundHelloWorld[i] = searchInList.IndexOf("Hello World");
任何人都知道这样做的方法吗?
由于
答案 0 :(得分:8)
searchInList.Select((value, index) => new {value, index})
.Where(a => string.Equals(a.value, "Hello World"))
.Select(a => a.index)
如果您尝试搜索的不仅仅是"Hello World"
,那么您可以
searchInList.Select((value, index) => new {value, index})
.Where(a => stringsToSearchFor.Any(s => string.Equals(a.value, s)))
.Select(a => a.index)
答案 1 :(得分:2)
既然你知道你正在寻找所有的事件,因此你必须遍历整个列表,你只需要自己检查每个元素就可以获得比使用IndexOf更多的可读性:
var i=0;
foreach(var value in searchInList)
{
if(value == "Hello World")
foundHelloWorld.Add(i); //foundHelloWorld must be an IList
i++;
}
您还可以使用Linq Select方法的重载,该方法在源集合中包含元素的索引;这应该对Linq经验丰富的程序员具有高度可读性(并因此可维护):
foundHelloWorld = searchInList
.Select((v,i)=>new {Index = i, Value = v})
.Where(x=>x.Value == "Hello World")
.Select(x=>x.Index)
.ToList();
上面的代码获取列表并将字符串转换为简单的匿名类型,其中包含每个项目在原始列表中的位置。然后,它过滤到只匹配的元素,然后它将索引(没有通过过滤更改)投影到新的List对象中。但是,所有这些转换都会使此解决方案执行速度变慢,因为此语句将多次遍历整个列表。
答案 2 :(得分:1)
有点难看但会奏效:
var searchInList = new List<string>();
//Populate your list
string stringToLookUp= "Hello world";
var foundHelloWorldIndexes = new List<int>();
for (int i = 0; i < searchInList.Count; i++)
if (searchInList[i].Equals(stringToLookUp))
foundHelloWorldIndexes.Add(i);
答案 3 :(得分:-1)