我有一個字符串列表:查找重複的字符串指標在C#列表
["String1"]
["String2"]
["String1"]
["String3"]
["String2"]
["String1"]
,我需要在列表中搜索和查找「的String1」的指標,也算有多少次「的String1」發生。我已閱讀this answer,但我對C#中這種類型的編碼不熟悉,而且我不清楚如何提取索引值,所以如果能夠解釋如何使用解決方案,那將非常棒!
我有一個字符串列表:查找重複的字符串指標在C#列表
["String1"]
["String2"]
["String1"]
["String3"]
["String2"]
["String1"]
,我需要在列表中搜索和查找「的String1」的指標,也算有多少次「的String1」發生。我已閱讀this answer,但我對C#中這種類型的編碼不熟悉,而且我不清楚如何提取索引值,所以如果能夠解釋如何使用解決方案,那將非常棒!
從對方的回答,我將在這裏重複供參考的代碼,
var duplicates = data
.Select((t,i) => new { Index = i, Text = t })
.GroupBy(g => g.Text)
.Where(g => g.Count() > 1);
返回IGrouping
的IEnumerable
,它本身就是一個匿名類型的IEnumerable
。你可以索引出這樣的結果:
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);
這將返回int
的IEnumerable
。
爲什麼downvote?如果我的回答有問題,我很樂意糾正它。 –
其抄襲來自另一個問題。 –
@ DanielA.White OP的問題是關於試圖更好地理解* that *代碼。我在這裏複製它以獲得更好的上下文(因爲OP沒有將它包含在實際問題中)。這對我來說似乎相當合理,因爲我的確提供瞭解釋OP的具體問題的解釋。你更喜歡我只是鏈接到答案(可能在將來編輯,破壞這個上下文),或者編輯問題以包含OP令人困惑的代碼? –
開始從答案理解代碼(見下面我的意見):
// 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);
}
您可以使用ToDictionary
方法獲取Dictionary<string, List<int>>
:
var duplicated = data.Select((x, i) => new { i, x })
.GroupBy(x => x.x)
.Where(g => g.Count() > 1)
.ToDictionary(g => g.Key, g => g.Select(x => x.i).ToList());
在每Key
存在其中的字符串實際上發生在源列表索引列表。
@Daniel。 OP在他自己的問題中實際上提到了這個問題,所以顯然需要比它提供的更多細節。 –
@mark - 請在這裏作爲您的問題。 –
@Mark你真的只需要''String1''的指示,還是你想要所有*字符串的標記?如果你只關心''String1'',那麼使用一個基本循環會有一個更簡單的解決方案。 –