【发布时间】:2017-01-16 23:09:39
【问题描述】:
在没有Linq的C#中删除IList中重复项的最有效方法是什么
我有来自另一个 SO [1] 的以下代码,
IList<IList<int>> output = new List<IList<int>>();
var lists = output;
for (int i = 0; i < lists.Count; ++i)
{
//since we want to compare sequecnes, we shall ensure the same order of the items
var item = lists[i].OrderBy(x => x).ToArray();
for (int j = lists.Count - 1; j > i; --j)
if (item.SequenceEqual(lists[j].OrderBy(x => x)))
lists.RemoveAt(j);
}
我在更大的编码挑战中使用它并且没有 Linq 或语法糖,我想看看是否有任何优雅/快速的解决方案?
我正在考虑只使用哈希,但我不确定使用哪种哈希函数来识别列表已经可用?
更清楚 对于像
这样的输入{{1,2,4, 4}, {3,4,5}, {4,2,1,4} }
中间输出是[排序输入/输出很好]
{{1,2,4,4}, {3,4,5}, {1,2,4,4} }
输出:
{{1,2,4,4}, {3,4,5}}
【问题讨论】:
-
HashSet 有方法
SetEquals可以更快地检查两个集合,但是你不能在 HashSet 中有重复的数字。有问题吗? -
@M.kazemAkhgary 我里面的列表可能包含重复项,我现在编辑了示例
-
没有 Linq 真的很难,我想的是对数字进行分组,然后将键及其值放入字典中以提供快速检查数字,这将占用更多空间,但速度会更快.
-
显然,实现 LINQ
Distinct序列运算符的人无法使用 LINQ 的Distinct运算符。如果您想知道他们是如何做到的,请阅读源代码。但看起来你正在做一些操作而不是直接Distinct。不过,它可能会给您一些见解。 -
换一种说法:你能写一个使用 LINQ 序列运算符的解决方案吗?如果是这样,那么您可以在不使用 LINQ 序列运算符的情况下编写解决方案,因为这些运算符都不是魔术。它们都是由像你这样的人实施的。
标签: c# algorithm linq duplicates