如何找到第一个匹配的索引?

时间:2014-06-27 15:04:44

标签: c# visual-studio-2010 list indexing match

我正在使用它:

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

2 个答案:

答案 0 :(得分:4)

无论您如何找到索引,它都将是次优的。你最后两次枚举这个集合。相反,你应该:

  1. 使用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
        }
    }
    
  2. 使用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++;
    }
    
  3. 无论哪种方式,您只需要一次循环收集而不是两次(一次用于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'?