Get every information about the Reservation
I hope I have understood this now.

Instead of iterating over all the Duct items and adding each iteration the related Curve to curves you should create another class like  

public class DuctCurev
{
    public Duct TheDuct {get; private set; }
    public Curve TheCurve {get; private set; }
    public DuctCurve(Duct duct, Curve curve)
    {
        TheDuct = duct;
        TheCurve = curve;
    }
}


now we iterate once over all of the Duct's and find the related Curve which we will add to a List&lt;DuctCurve&gt; like so  

List&lt;DuctCurve&gt; ductCurves = new List&lt;DuctCurve&gt;();
foreach (Duct d in ducts)
{
    ductCurves.Add(d, FindDuctCurve(d));
}  


then we need to adjust the remaining code to use the ductCurves and use the ! operator instead of using containsItemX == false like so

foreach (Wall w in walls)
{
    wallFaces = FindWallFace(w);
    foreach (DuctCurve dc in ductCurves)
    {
        foreach (Face f in wallFaces)
        {
            foreach (KeyValuePair&lt;XYZ, Wall&gt; pair in FindInterWalls(dc.Curve, f, walls))
            {
                Reservation.Res res = new Reservation.Res();
                res.RoundCenter = new XYZ(Math.Round(pair.Key.X), Math.Round(pair.Key.Y), Math.Round(pair.Key.Z));
                res.WallWidth = pair.Value.Width;
                bool containsItemX = resList.Any(itemX =&gt; itemX.RoundCenter.DistanceTo(res.RoundCenter) &lt; res.WallWidth + 1);

                if (!containsItemX)
                {
                    res.AssociatedWall = pair.Value;
                    res.Radius = 1;
                    res.AssociatedDuct = dc.Duct;

                    res.Center = pair.Key;
                    resList.Add(res);
                    model.Reservations.Add(new Reservation { ResList = resList });
                }
            }
        }
    }
}