I am new to anonymous classes, and today I think I came across the first case when it seemed to me that I really could use them. I am writing a method that will be useful for storing temporary data inside a class, and since this class has no meaning outside this method, using an anonymous class makes sense to me (at least while it was running).
After the coding started, it seemed to me that I would have to make some concessions. I like to assign things like calculations to temporary variables, so during debugging I can check the bits of the calculations at a time in logical chunks. Then I want to assign something simpler to the final value. This value will be in an anonymous class.
The problem is that in order to briefly implement my code with anonymous classes, I would like to use LINQ. The problem here is that I don’t think you can do such temporary calculations inside an instruction. or you can?
Here is a far-fetched example of what I want to do:
namespace AnonymousClassTest
{
public partial class Window1 : Window
{
ObservableCollection<RectanglePoints> Points { get; set; }
public class RectanglePoints
{
public Point UL { get; set; }
public Point UR { get; set; }
public Point LL { get; set; }
public Point LR { get; set; }
}
public class DontWantThis
{
public double Width { get; set; }
public double Height { get; set; }
}
private Dictionary<string,string> properties = new Dictionary<string,string>();
private Dictionary<string,double> scaling_factors = new Dictionary<string,double>();
private void Sample()
{
var widths_and_heights = from rp in Points
select new
{
Width = (rp.UR.X - rp.UL.X) * scaling_factors[properties["dummy"]],
Height = (rp.LL.Y - rp.UL.Y) * scaling_factors[properties["yummy"]]
};
List<DontWantThis> other_widths_and_heights = new List<DontWantThis>();
foreach( RectanglePoints rp in Points) {
double base_width = rp.UR.X - rp.UL.X;
double width_scaling_factor = scaling_factors[properties["dummy"]];
double base_height = rp.LL.Y - rp.UL.Y;
double height_scaling_factor = scaling_factors[properties["yummy"]];
other_widths_and_heights.Add( new DontWantThis
{
Width=base_width * width_scaling_factor,
Height=base_height * height_scaling_factor
});
}
foreach( var wah in widths_and_heights)
Console.WriteLine( String.Format( "{0} {1}", wah.Width, wah.Height));
foreach( DontWantThis dwt in other_widths_and_heights)
Console.WriteLine( String.Format( "{0} {1}", dwt.Width, dwt.Height));
}
public Window1()
{
InitializeComponent();
Points = new ObservableCollection<RectanglePoints>();
Random rand = new Random();
for( int i=0; i<10; i++) {
Points.Add( new RectanglePoints { UL=new Point { X=rand.Next(), Y=rand.Next() },
UR=new Point { X=rand.Next(), Y=rand.Next() },
LL=new Point { X=rand.Next(), Y=rand.Next() },
LR=new Point { X=rand.Next(), Y=rand.Next() }
} );
}
Sample();
}
}
}
NOTE. Do not try to run this unless you actually add keys to the dictionary :)
LINQ , . , , . , , . .
, . , , , , , LINQ.
, , ! , .
- , ? - ? , StackOverflow, , .