查找List中value的第一个索引
本文关键字:第一个 索引 value List 查找 | 更新日期: 2023-09-27 18:02:46
在文本中,我有一些相同的单词,我想获得每个单词的位置。使用这样的结构:
fullText = File.ReadAllText(fileName);
List<string> arr = fullText.Split(' ').ToList();
List<string> result = arr.
Where(x => string.Equals(x, "set", StringComparison.OrdinalIgnoreCase)).
ToList();
for (int i = 0; i < result.Count; i++)
{
Console.WriteLine(arr.IndexOf(result[i]));
}
我只得到每个单词的最后一个位置。例如,我有:
**LOAD SUBCASE1 SUBTITLE2 LOAD SUBCASE3 SUBTITLE4 load Load Load**
,我必须得到
**LOAD : position 1
LOAD : position 4
load : position 7
Load: position 8
Load : position 8**
要获取索引,尝试这样做;
List<string> result = arr.Select((s,rn) => new {position = rn+1, val = s})
.Where(s => string.Equals(s.val, "LOAD", StringComparison.OrdinalIgnoreCase))
.Select(s => s.val + " : position " + s.position.ToString())
.ToList();
上面的查询不会返回**LOAD
和Load**
。为了最终获得**
的预期结果,我认为您可以使用s.val.Contains()
,如下所示:
List<string> result = arr.Select((s, rn) => new { position = rn + 1, val = s })
.Where(s => s.val.ToLower().Contains("load"))
.Select(s =>
s.val.EndsWith("**") ? s.val.Substring(0, s.val.Length - 2) +
" : position " + s.position.ToString() + "**" : s.val + " : position " +
s.position.ToString())
.ToList();
在您的wordlist. ....中没有"set"我错了,反而错了"负载"
您正在使用Equals
进行比较。这意味着您要比较整个单词,而不是单词的一部分,因此"**LOAD"将被省略。这是你想要的吗?否则使用IndexOf
。
但是,您可以使用以下查询:
var words = fullText.Split().Select((w, i) => new{Word = w, Index = i});
var matches = words.Where(w => StringComparer.OrdinalIgnoreCase.Equals("load", w.Word));
foreach(var match in matches)
{
Console.WriteLine("Index: {0}", match.Index);
}
Index: 4
Index: 7
Index: 8
IndexOf
方法是:
var partialMatches = words.Where(w => w.Word.IndexOf("load", StringComparison.OrdinalIgnoreCase) != -1);
foreach (var partialMatch in partialMatches)
{
Console.WriteLine("Index: {0}", partialMatch.Index);
}
Index: 0
Index: 4
Index: 7
Index: 8
Index: 9
下面是完成这项工作的扩展方法:
public static class Extensions
{
public static IEnumerable<int> IndecesOf(this string text, string pattern)
{
var items = text.Split(' ');
for(int i = 0; i < items.Count(); i++)
if(items[i].ToLower().Contains(pattern));
yield return i + 1;
}
}
和用法:
var fullText = "**LOAD SUBCASE1 SUBTITLE2 LOAD SUBCASE3 SUBTITLE4 load Load Load**";
foreach(int i in fullText.IndecesOf("load"))
Console.WriteLine(i);
输出:请注意,我从示例字符串中删除了双空格,当使用双空格时,分割将向数组添加一个空字符串。