我正在使用它:
foreach (var item in set)
{
string matchingString = conLines.FirstOrDefault(r => (r.IndexOf(item.firstParam) >= 0 && r.IndexOf(item.secondParam) >= 0) && (r.IndexOf(item.firstParam) < r.IndexOf(item.secondParam)));
}
其中:
List<string> conLines = ...
并且
public class className
{
public string firstParam { get; set; }
public string secondParam { get; set; }
}
public static List<className> set = ....
我想知道找到匹配字符串的conLines索引。
在一天结束时,我要做的是搜索conLines,逐字符串搜索所有与firstParam和secondParam的匹配(顺序地,在相同的conLines字符串中)。如果找到匹配项,我想在conLines中更改该字符串。无论线条是否找到匹配并且是否更改,我都想将其打印出来。所以基本上我正在阅读conLines并将其全部打印出来,包括找到firstParam和secondParam匹配的行的更改。
示例:
如果conLines是:
alpha beta dog cat
chair ramp table seat
blog journal article letter
和firstParam,secondParam包括:
ramp, table
article, letter
我所做的更改是在比赛中添加-01,我将打印出来:
alpha beta dog cat
char ramp-01 table-01 seat
blog journal article-01 letter-01
答案 0 :(得分:4)
无论您如何找到索引,它都将是次优的。你最后两次枚举这个集合。相反,你应该:
使用for
循环遍历集合(如果可能)。这样,无论何时找到第一个匹配项,您都已经拥有索引(仅当集合公开和索引器以及预先计算的长度/计数属性时才有效):
for(var i = 0; i < collection.Count; i++)
{
if(collection[i] == query)
{
// You have the match with collection[i] and the index in i
}
}
使用GetEnumerator
遍历集合并使用计数器计算索引。这适用于任何IEnumerable
:
var enumerator = collection.GetEnumerator();
var count = 0;
while(enumerator.MoveNext())
{
if(enumerator.Current == query)
{
// You have the match in enumerator.Current and the index in count
}
count++;
}
无论哪种方式,您只需要一次循环收集而不是两次(一次用于FirstOrDefault
,然后再次获取索引。
答案 1 :(得分:1)
您可以在前面使用包含索引的Select
来执行此操作:
var temp = conLines.Select((l, i) => new {l, i})
.FirstOrDefault(r => (r.l.IndexOf(item.firstParam) >= 0
&& r.l.IndexOf(item.secondParam) >= 0)
&& (r.l.IndexOf(item.firstParam) < r.l.IndexOf(item.secondParam)
));
string matchingString = temp.l;
int index = temp.i;
虽然我很难弄明白你如何得到你想要的输出。为什么两行都有'01'?