c# - 有效地检查 List<List<int>> 中的数字是否仅以正数或负数存在

标签 c# c++ .net linq

我有一个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/

相关文章:

c# - 如何在 C# 中创建自定义类型的数组?

c# - 使用 BitConverter 在 C# 中进行快速转换,它能更快吗?

c# - 如何将可空类型传递给 P/调用函数

.net - Win32 API FindFirstFile 和 FindNextFile 性能与命令行的比较

c# - 为什么在这个非常简单的场景中我的 .net 析构函数没有被调用?

c# - 当鼠标在控件上方时如何消除 ToolStripDropDownButton 上的蓝色焦点

c++ - 将 Autotools 用于新的共享库

c++ - 如何将宏参数转发到格式 func?

c++ - 在 boost::asio 中发送/接收结构

c# - 正则表达式控制中的双引号