我有一个List<List<int>>
数据集,具有如下字符串表示形式(给出想法!):
{{1,3},{-1,-3},{2,5},{-2,-5},{-3,4},{-5,4},{3,5,-4},{6,-8},{7,-8},{-6,-7,8},{7,9},{-7,-9},{3,8,-10},{-3,-8,-10},{-3,8,10},{3,-8,10},{4,9,-11},{-4,-9,-11},{-4,9,11},{4,-9,11},{10,11},{-1,6},{1,-6},{-2,7},{2,-7}}
我想检查在所有现有的数字中是否存在一个或一组数字,其形式仅为正数。我的意思是,如果在整个数据中,有 3 和 -3 我应该返回 false,否则我必须将 3 作为仅作为正 3 存在的数字添加到另一个列表中。 (仅负数相同)
这是我尝试的方法:
首先,生成一组唯一的数字并删除负数:
private void GenerateCurrentExistingVariables()
{
_uid = new List<int>();
var all = _cnf.Data.SelectMany(list => list).ToList();
_uid = all.Distinct().ToList(); //make list unique
_uid.Sort(); //sort numbers
_uid.Reverse(); //reverse so highest numbers would evalaute first!
_uid = _uid.Where(i => i >= 0).ToList(); //remove negative numbers
}
然后我做了这样的事情:
在一个方法中,我调用下面的代码:
for (var i = 0; i < _uid.Count; i++)
{
if (ExistOnlyInNegatedForm(_uid[i]))
{
onlyNegatedList.Add(_uid[i]);
}
//perhaps continue
if (ExistOnlyInPositiveForm(_uid[i]))
{
onlyPositiveList.Add(_uid[i]);
}
}
依次调用以下方法:
private bool ExistOnlyInPositiveForm(int id)
{
for (var i = 0; i < _cnf.Data.Count; i++)
{
for (var j = 0; j < _cnf.Data[i].Count; j++)
{
if (_cnf.Data[i][j] == id)
{
return false;
}
}
}
return true;
}
private bool ExistOnlyInNegatedForm(int id)
{
var toCheck = -id;
for (var i = 0; i < _cnf.Data.Count; i++)
{
for (var j = 0; j < _cnf.Data[i].Count; j++)
{
if (_cnf.Data[i][j] == -toCheck)
{
return false;
}
}
}
return true;
}
对于这个简单的任务来说,代码太多了,我觉得当数据变大时,速度会变得越来越慢...请让我知道如何改进它。另外,我希望使用 LINQ 来完成此操作,至少是为了减少代码行数!
我也很想看到 C++ 解决方案,因此我在问题中标记了 C++(不是在做语言垃圾邮件!)
最佳答案
对于正数:
var uids = _uid.SelectMany(q => q).ToArray();
var positive = uids.Where(p => p >= 0).Distinct()
.Except(uids.Where(p => p < 0).Select(p => -p))
.ToList();
return positive.Any();
对于负数:
var negative = uids.Where(p => p < 0).Distinct()
.Except(uids.Where(p => p >= 0).Select(p => -p))
.ToList();
return negative.Any();
关于c# - 有效地检查 List<List<int>> 中的数字是否仅以正数或负数存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31095943/