2

文字列のリストがあります:

["String1"]
["String2"]
["String1"]
["String3"]
["String2"]
["String1"]

リスト内の「String1」のインデックスを検索して見つける必要があり、「String1」が発生した回数もカウントする必要があります。この回答を確認しましたが、C# でのこのタイプのコーディングは初めてで、インデックス値を抽出する方法が不明なので、ソリューションの使用方法を説明できれば、それは素晴らしいことです!

4

3 に答える 3

13

参照用にここで複製する他の回答のコードは、

var duplicates = data
  .Select((t,i) => new { Index = i, Text = t })
  .GroupBy(g => g.Text)
  .Where(g => g.Count() > 1);

それ自体が匿名型のIEnumerableofを返します。次のように、結果からインデックスを取得できます。IGroupingIEnumerable

foreach(var group in duplicates)
{
    Console.WriteLine("Duplicates of {0}:", group.Key)
    foreach(var x in group)
    {
        Console.WriteLine("- Index {0}:", x.Index)
    }
}

SelectManyただし、インデックスのリストを取得するだけの場合は、拡張メソッドを使用できます。

var duplicateIndexes = data
  .Select((t,i) => new { Index = i, Text = t })
  .GroupBy(g => g.Text)
  .Where(g => g.Count() > 1)
  .SelectMany(g => g, (g, x) => x.Index);

IEnumerableこれはの を返しintます。

于 2013-08-31T12:16:48.723 に答える
2

回答からコードを理解することから始めます(以下の私のコメントを参照してください):

// Produce an enumeration of Index/Text pairs
var duplicates = data
    // First, add the index to the value by using Select with an anonymous type
    .Select((t,i) => new { Index = i, Text = t })
    // Next, group the results by the content of the string
    .GroupBy(g => g.Text)
    // Finally, keep only groups with more than one item.
    .Where(g => g.Count() > 1);

目的に合わせて変更しましょう。

// Produce an enumeration of Indexes of "String1"
var allString1Indexes = data
    // First, add the index to the value by using Select with an anonymous type
    .Select((t,i) => new { Index = i, Text = t })
    // Keep only the "String1" items
    .Where(p => p.Text == "String1")
    // Use only indexes
    .Select(p => p.Index);

今すぐ結果を反復して、のすべてのインデックスを出力できます"String1":

foreach (var i in allString1Indexes) {
    Console.WriteLine("String1 is found at index {0}", i);
}
于 2013-08-31T12:18:02.100 に答える