0

テキストには同じ単語がいくつかあり、各単語の位置を取得したいと思います。そのような構造を使用する:

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**
4

3 に答える 3

2

インデックスを取得するには、次のようにしてください。

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();

上記のクエリは**LOADand を返しません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();
于 2013-03-06T14:23:13.227 に答える
0

あなたのワードリストに「セット」はありません。....私は間違いました、代わりに「ロード」でなければなりません

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
于 2013-03-06T14:27:30.780 に答える
0

ジョブを実行する拡張メソッドを次に示します。

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);

出力:

1 4 7 8 9

example-string からダブル スペースを削除したことに注意してください。ダブル スペースを使用すると、分割により空の文字列が配列に追加されます。

于 2013-03-06T14:40:04.023 に答える