加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Parallel.ForEach with tuple return c#

发布时间:2020-12-15 23:40:02 所属栏目:百科 来源:网络整理
导读:基于这个 example,我试图用元组返回做一个平行的foreach. double min = double.MaxValue;object syncObject = new object(); Parallel.ForEach(collection,() = double.MaxValue,(item,loopState,localState) = { double value = item.PerformComputation();
基于这个 example,我试图用元组返回做一个平行的foreach.

double min = double.MaxValue;

object syncObject = new object(); 
Parallel.ForEach(collection,() => double.MaxValue,(item,loopState,localState) =>
    {
        double value = item.PerformComputation();
        return System.Math.Min(localState,value);
    },localState =>
    {
        lock(syncObj)
            min = System.Math.Min(min,localState);
    }
);

Console.Write(min + "n");

上面的代码工作正常,但在我的场合(正确的最小值),但我不想输出最小值,但输出该值的’名称’,所以我尝试这样的事情:

double min = double.MaxValue;
string minName = "";

object syncObject = new object(); 
Parallel.ForEach(collection,() => Tuple.Create(double.MaxValue,""),localState) =>
    {
        double value = PerformComputation(item.Item1.Value);
        string name = item.Item1.Key;

        return //helpHere
    },localState =>
    {
        lock(syncObj)
            min = //help here
            minName = //help here
    }
);

Console.Write(minName + "n");

尝试了几件不起作用的东西.我也读过没有运气的microsoft’s example.
任何帮助赞赏.

解决方法

你的问题中没有太多的背景.你最好提供一个好的 Minimal,Complete,and Verifiable code example来展示你正在做的事情.但是,似乎在您的第二个代码版本中,您已将计算模型从具有PerformComputation()方法的对象更改为本地定义的PerformComputation()方法,以及某种Tuple对象的集合,其中Item1成员是KeyValuePair< TKey,TValue>某种.

做出这些假设,这样的事情应该适用于你的场景:

Tuple<double,string> result = Tuple.Create(double.MaxValue,"");

object syncObject = new object(); 
Parallel.ForEach(collection,localState) =>
    {
        double value = PerformComputation(item.Item1.Value);

        if (value < localState.Item1)
        {
            localState = Tuple.Create(value,item.Item1.Key);
        }

        return localState;
    },localState =>
    {
        lock(syncObj)
        {
            if (localState.Item1 < result.Item1)
            {
                result = localState;
            }
        }
    }
);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读