問題: 我有一個int列表,我想獲取存在兩次或更多次的數字。用LINQ創建臨時工作變量?
List<int> firstList = new List<int> { 1, 1, 3 };
預期結果:
{ 1 }
這可以很容易地與LINQ完成。例如這一個
var result = firstList.Where(c => firstList.Count(d => c == d) > 1).Distinct();
問題是這種做了多於一個迭代。與正常的for循環,我們可以達到的O時間(N)..
List<int> result = new List<int>();
HashSet<int> doubles = new HashSet<int>();
foreach (var v in firstList)
{
if (!doubles.Contains(v))
doubles.Add(v);
else
result.Add(v);
}
這是我們希望與LINQ aswel做...
HashSet<int> doubles = new HashSet<int>();
var result = firstList.Where((c) => doubles.Contains(c) ? true : !doubles.Add(c)).ToList();
這是我唯一的出路可以想到..
問題: 有沒有什麼辦法可以在LINQ中聲明我的「新HashSet」。林想這樣firstList.Aggregate((c, d = new HashSet<int>) =>
..
是的你是對的。我的意思是兩次或更多次。然而這也會是O(N)^ 2 ..這比O(N)場景更糟:( – Evelie 2013-03-01 08:13:44
@Evelie:是什麼讓你認爲它會是O(N^2)?(組被實現,是O(1)。) – 2013-03-01 08:14:20
GroupBy將迭代列表中的條目,然後你必須再次迭代它們(在每個組內)以計算它們......或者至少這是我的想法 – Evelie 2013-03-01 08:15:21