2

ファイル名のリスト(targetFileList)があり、そのうちのいくつかは重複しています(たとえば、m4.txtという2つのファイルがあります)。次のステートメントは、重複したファイル名を見つけて、それらを別のリスト(currentTargetFiles)に追加します。

currentTargetFiles = targetFileList.FindAll(item => item == baselineFilename);

この行は、文字列(ファイル名)のリストを返しています。これは適切ですが、インデックス値も必要です。ファイルのインデックスも返すように変更する方法はありますか?

4

4 に答える 4

7

さて、これが「重複する名前とそのインデックスを見つける」という私の答えです。考慮されていないため、提示された問題に正確に適合しない可能性がありますがbaselineFilename、それは他の回答でカバーされています。YMMV。

var names = new [] {"a", "a", "c", "b", "a", "b"};

var duplicatesWithIndices = names
    // Associate each name/value with an index
    .Select((Name, Index) => new { Name, Index })
    // Group according to name
    .GroupBy(x => x.Name)
    // Only care about Name -> {Index1, Index2, ..}
    .Select(xg => new {
        Name = xg.Key,
        Indices = xg.Select(x => x.Index)
    })
    // And groups with more than one index represent a duplicate key
    .Where(x => x.Indices.Count() > 1);

// Now, duplicatesWithIndices is typed like:
//   IEnumerable<{Name:string,Indices:IEnumerable<int>}>

// Let's say we print out the duplicates (the ToArray is for .NET 3.5):
foreach (var g in duplicatesWithIndices) {
    Console.WriteLine("Have duplicate " + g.Name + " with indices " +
        string.Join(",", g.Indices.ToArray()));
}

// The output for the above input is:
// > Have duplicate a with indices 0,1,4
// > Have duplicate b with indices 3,5

もちろん、提供された結果は正しく使用する必要があります。これは、最終的に何を実行する必要があるかによって異なります。

于 2013-03-18T19:27:48.640 に答える
2
int i = -1;
var currentTargetFiles = targetFileList.Select(x => new
                                                        {
                                                           Value = x,
                                                           Index = i++
                                                        })
                                       .Where(x => x.Value == baselineFilename);
于 2013-03-18T18:22:15.887 に答える
2

次のコマンドを使用して、すべてのアイテムとそのインデックスを選択できます。

tempList = targetFileList.Select((item, index) => 
    new { Value = item, Index = index }).Where(x => x.Value == baselineFilename);

これで、名前と対応するインデックスのリストを次のように作成できます。

var indexes = tempList.Select(x => x.Index).ToList();

そして値:

currentTargetFiles = tempList.Select(x => x.Value).ToList();

次に、indexes[0]のリストインデックスを保持しますcurrentTargetFiles[0]

于 2013-03-18T18:37:56.370 に答える
1

linqは要件ですか?

従来のforループと辞書でうまくいくでしょう:

Dictionary<int, string> currentTargetFiles = new Dictionary<int, string>();
for (int i = 0; i < targetFileList.Count; ++i)
    if(targetFileList[i] == baselineFilename)
        currentTargetFiles.Add(i, targetFileList[i]);

PS:

正確な文字列()を比較していることに気づきましたitem == baselineFilename

この場合、各インデックスの各値を保持する必要はありません(すべての値が同じであるため)。

List<int> currentTargetFilesIndices = new List<int>();
for (int i = 0; i < targetFileList.Count; ++i)
    if(targetFileList[i] == baselineFilename)
        currentTargetFiles.Add(i);
于 2013-03-18T18:43:18.467 に答える