C# 如何将值从foreach循环传递到另一个方法

C# 如何将值从foreach循环传递到另一个方法,c#,methods,foreach,unity3d,C#,Methods,Foreach,Unity3d,我需要做的是从一个名为private void ReceiveData()的方法中获取foreach值,然后将它们发送到另一个方法void Update()。在c#中如何做到这一点 有两个方法,我需要从ReceiveData()获取foreach中的值,并在method Update()中实例化它们。foreach from ReceiveData()中的所有变量都是公共变量,但它们在Update()中都接受0。foreach的工作方式如下: 在您的方法(ReceiveData)中,您将循环使用

我需要做的是从一个名为
private void ReceiveData()
的方法中获取foreach值,然后将它们发送到另一个方法
void Update()
。在c#中如何做到这一点


有两个方法,我需要从ReceiveData()获取foreach中的值,并在method Update()中实例化它们。foreach from ReceiveData()中的所有变量都是公共变量,但它们在Update()中都接受0。

foreach的工作方式如下:

在您的方法(
ReceiveData
)中,您将循环使用某种方法。然后可以从该循环调用另一个方法(
Update
)。但是,您必须传递这些变量。您的方法当前无效,并且没有任何参数

我建议如下:

private void ReceiveData()
{
    var data = GetMyDataFromSomewhere(); // data should be an IEnumerable of some sort

    foreach (MyDataItemType dataItem in data)
    {
        Update(dataItem);
    }
}

private void UpdateData(MyDataItemType dataItem)
{
    // Do some update to dataItem here...
}
在使用更多代码进行新的更新之后,还有更多的信息需要处理。显然,您正在类中设置一些字段/属性(
x
y
z
,等等)。更新方法将使用这些来更新某些内容

那么为什么不直接从
foreach
循环中调用
Update()
,或者在循环之后调用
Update()

foreach(SignalIndex si in xmlreader.cdpSignals)
{
    x= ReadSingleBigEndian(data, si.index + 0);
    y= ReadSingleBigEndian(data, si.index + 4);
    z= ReadSingleBigEndian(data, si.index + 8);
    alpha= ReadSingleBigEndian(data, si.index + 12);
    theta= ReadSingleBigEndian(data, si.index + 16);
    phi= ReadSingleBigEndian(data, si.index + 20);

    UpdateData(); // Just call it!
}
编辑2:

ReaderWriterLockSlim的文档:

struct-CoordData
{
公共浮点数X,Y,Z,α,θ,φ;
公共国际指数;
}
私有列表coordDataList=新列表();
私有ReaderWriterLockSlim lockObj=新的ReaderWriterLockSlim();
私有void ReceiveData()
{
IPEndPoint remoteIP=新IPEndPoint(IPAddress.Parse(“10.0.2.217”),端口);
客户端=新的UdpClient(remoteIP);
while(true)
{
尝试
{
IPEndPoint anyIP=新IPEndPoint(IPAddress.Any,0);
数据=client.Receive(ref anyIP);
int-nIndex=0;
foreach(xmlreader.cdpSignals中的信号索引si)
{
x=ReadSingleBigEndian(数据,si.index+0);
y=ReadSingleBigEndian(数据,si.index+4);
z=ReadSingleBigEndian(数据,si.index+8);
alpha=ReadSingleBigEndian(数据,si.index+12);
θ=ReadSingleBigEndian(数据,si.index+16);
phi=ReadSingleBigEndian(数据,si.index+20);
lockObj.EnterWriteLock();
尝试
{
添加(新的CoordData(){X=X,Y=Y,Z=Z,Alpha=Alpha,Theta=Theta,Phi=Phi,NIndex=NIndex});
}
最后
{
lockObj.ExitWriteLock();
}
nIndex++;//我假设您希望在这里执行此操作,否则每次都会更改数组中的相同对象
}
}
捕获(异常错误)
{
打印(err.ToString());
}
}
client.Close();
}
无效更新()
{
lockObj.EnterReadLock();
尝试
{
foreach(coordDataList中的CoordData数据)
{
unityGameObjects[data.NIndex].localPosition=newvector3(data.X,data.Y,data.Z);
unityGameObjects[data.NIndex].Rotate(data.Alpha,data.Theta,data.Phi);
}
}
最后
{
lockObj.exitradlock();
}
}

从一个方法获取foreach值是什么意思?需要更多上下文。不清楚您的意思是什么,特别是因为这两种方法都不带参数并返回
void
@marcgravel,您好!我用更多的上下文更新了我的问题:)我的void Update()不能接受任何参数:(你可以创建参数吗?当我调用我的Update()时)它显示了一个错误:get_transform只能从主线程调用。加载场景时,构造函数和字段初始值设定项将从加载线程执行。不要在构造函数或字段初始值设定项中使用此函数,而是将初始化代码移动到唤醒或启动函数。在这种情况下,我们肯定需要更多的合作你在使用某种库吗?这个类是否继承了某些东西?它到底会产生什么错误?例如,我甚至没有在任何地方看到
get\u transform
…请为你的问题添加更多信息。我已经编辑了我的答案,但我怀疑它是否有效,因为我刚刚看到了下面答案上的注释。你需要调用update吗当您收到数据后,是否可以将值存储在数组或其他东西中,然后在Update()中读取它们?在另一个脚本中调用Update()时,我的Update()无法获取任何参数。我收到一个错误,它说我需要从主线程调用它,我不知道如何将x、y、z、alpha、θ、phi传递到Update()很抱歉,我遇到了一个错误:错误CS1914:静态字段或属性
udprecive.CoordData.NIndex'无法在对象初始值设定项中赋值;错误CS0122:
udprecive.CoordData.NIndex'由于其保护级别而无法访问。您有机会尝试一下吗?非常感谢它可以工作!但在运行时还有一个问题将其打印出以下“System.Threading.LockRecursionException:在System.Threading.ReaderWriterLockSlim.TryEnterWriteLock(Int32毫秒超时)[0x00000]in:0 at System.Threading.ReaderWriterLockSlim.EnterWriteLock()[0x00000]in:0”有办法解决此问题吗?
foreach(SignalIndex si in xmlreader.cdpSignals)
{
    x= ReadSingleBigEndian(data, si.index + 0);
    y= ReadSingleBigEndian(data, si.index + 4);
    z= ReadSingleBigEndian(data, si.index + 8);
    alpha= ReadSingleBigEndian(data, si.index + 12);
    theta= ReadSingleBigEndian(data, si.index + 16);
    phi= ReadSingleBigEndian(data, si.index + 20);

    UpdateData(); // Just call it!
}
struct CoordData
{
    public float X, Y, Z, Alpha, Theta, Phi;
    public int NIndex;
}

private List<CoordData> coordDataList = new List<CoordData>();
private ReaderWriterLockSlim lockObj = new ReaderWriterLockSlim();

private void ReceiveData() 
{

   IPEndPoint remoteIP = new IPEndPoint(IPAddress.Parse("10.0.2.217"), port);
   client = new UdpClient(remoteIP);
    while (true) 
    {
       try 
        {
            IPEndPoint anyIP = new IPEndPoint(IPAddress.Any, 0);
            data = client.Receive(ref anyIP);

            int nIndex = 0;
            foreach(SignalIndex si in xmlreader.cdpSignals)
            {
                 x= ReadSingleBigEndian(data, si.index + 0);
                 y= ReadSingleBigEndian(data, si.index + 4);
                 z= ReadSingleBigEndian(data, si.index + 8);
                 alpha= ReadSingleBigEndian(data, si.index + 12);
                 theta= ReadSingleBigEndian(data, si.index + 16);
                 phi= ReadSingleBigEndian(data, si.index + 20);

                 lockObj.EnterWriteLock();
                 try
                 {
                     coordDataList.Add(new CoordData() { X = x, Y = y, Z = z, Alpha = alpha, Theta = theta, Phi = phi, NIndex = nIndex });
                 }
                 finally
                 {
                     lockObj.ExitWriteLock();
                 }

                 nIndex++; //I'm assuming you want to do this here otherwise you'll be changing the same object in the array every time  
            }

        }
        catch (Exception err) 
        {
           print(err.ToString());
        }

    }

    client.Close();
}

void Update()
{
    lockObj.EnterReadLock();
    try
    {
        foreach (CoordData data in coordDataList)
        {
            xmlReader.unityGameObjects[data.NIndex].localPosition = new Vector3(data.X,data.Y,data.Z);
            xmlReader.unityGameObjects[data.NIndex].Rotate(data.Alpha,data.Theta,data.Phi);
        }
    }
    finally
    {
        lockObj.ExitReadLock();
    }
}