我有一些C#代码。此代码的目的是生成一个整数列表,测试它们的值以查看它们是否是重复的条目值,并将任何重复的条目更改为唯一的(如果它们出现在列表中)。
static int oldHash, newHash; // used if collision true, // renews current hash
static Boolean Uniqiue; // only update variables?
public static int collisionHandling(int oldHash, bool unique)
{
if (!unique)
{
newHash = oldHash + 1;
return newHash;
}
else
{
newHash = oldHash;
return 0;
}
}
public static int hash(int value) {
return value +1;
}
static void Main(string[] args)
{
List<int> intLst = new List<int>(20);
intLst.Add(1);
intLst.Add(1);
intLst.Add(1);
int tst = 0;
while (tst <= intLst.Count - 1)
{
int hashResult = hash(intLst[tst]);
if (intLst.Contains(hashResult))
{
int collisionResult = collisionHandling(hashResult, false);
Console.WriteLine(collisionResult);
}
tst += 1;
}
Console.ReadLine();
}
此应用程序的输出是
3
3
3
很好,我已将值添加到新列表并进行了调整。但是,我没有在我的清单中保证一个独特的价值。 我该怎么做?
原则是不使用哈希表,我必须创建一个。哈希表必须具有唯一键,因此要处理重复尝试(冲突)。我不希望删除哈希键,我希望以使其唯一的形式处理它。因此,我的方法应该类似于value = value + Random.Next()
,因为这会产生更准确的结果,因为它与'value = value +1'相关。但是,这并不能确保唯一的输入。
提前致谢。
答案 0 :(得分:0)
您可以使用linq Distinct
从列表中提供一组。 (即从列表中删除重复项)。
然后添加新数字,因为删除了重复项目。
var list = ...;
var unique = list.Distinct().ToList();
var random = new Random();
for(int i = unique.Count(); i < list.Count(); i++)
{
int r;
do
{
r = random.Next();
} while(unique.Contains(r))
unique.Add(r);
}
// unique is the result you want
list = unique;
请注意,此方法不稳定。这意味着它不保证保持您的物品的顺序。这也可以在理论上变成无限循环。