- Details
- Written by: Stanko Milosev
- Category: C#
- Hits: 3886
My father "Velimir" also had three kids: "Anamaria", "Stanko" and "Nikola"
His sister "Svetlana" had two kids: "Dragan" and "Dragana"
Dragan had one kid "Sanja" and "Dragana" two kids "Jovana" and "Aleksa"
Julka had no kids.
Structure in string looks like this:
"Stanko|Velimir|Anamaria" "Stanko|Velimir|Stanko" "Stanko|Velimir|Nikola" "Stanko|Velimir|Anamaria|Tatjana" "Stanko|Svetlana|Dragan" "Stanko|Svetlana|Dragana" "Stanko|Julka" "Stanko|Svetlana|Dragan|Sanja" "Stanko|Svetlana|Dragana|Jovana" "Stanko|Svetlana|Dragana|Aleksa"Main code:
using System.Collections.Generic;
namespace TreeExample
{
class Program
{
static void Main(string[] args)
{
List<string> treeDescriptions = new List<string> { "Stanko|Velimir|Anamaria" };
treeDescriptions.Add("Stanko|Velimir|Stanko");
treeDescriptions.Add("Stanko|Velimir|Nikola");
treeDescriptions.Add("Stanko|Velimir|Anamaria|Tatjana");
treeDescriptions.Add("Stanko|Svetlana|Dragan");
treeDescriptions.Add("Stanko|Svetlana|Dragana");
treeDescriptions.Add("Stanko|Julka");
treeDescriptions.Add("Stanko|Svetlana|Dragan|Sanja");
treeDescriptions.Add("Stanko|Svetlana|Dragana|Jovana");
treeDescriptions.Add("Stanko|Svetlana|Dragana|Aleksa");
TreeMethods geni = new TreeMethods();
TreeStructure geniStructure;
geniStructure = geni.CreateStructure(treeDescriptions);
}
}
}
Class:
using System;
using System.Collections.Generic;
namespace TreeExample
{
class TreeStructure
{
public string Name { get; set; }
public List<TreeStructure> Children;
}
class TreeMethods
{
private TreeStructure CreateTree(string structure, TreeStructure parentTree)
{
if (string.IsNullOrWhiteSpace(structure))
{
return null;
}
else
{
string[] levels = structure.Split('|');
if (levels.Length > 1)
structure = structure.Substring(levels[0].Length + 1, structure.Length - levels[0].Length - 1);
else
structure = string.Empty;
if (parentTree is null)
{
parentTree = new TreeStructure();
parentTree.Name = levels[0];
if (!string.IsNullOrWhiteSpace(structure))
{
parentTree.Children = new List<TreeStructure>();
parentTree.Children.Add(CreateTree(structure, null));
}
}
else if (parentTree.Children is null)
{
if (!string.IsNullOrWhiteSpace(structure))
{
parentTree.Children = new List<TreeStructure>();
parentTree.Children.Add(CreateTree(structure, null));
}
}
else
{
bool found = false;
foreach (TreeStructure child in parentTree.Children)
{
string[] levelsChildren = structure.Split('|');
if (!(child is null))
{
if (string.Equals(child.Name, levelsChildren[0], StringComparison.InvariantCultureIgnoreCase))
{
CreateTree(structure, child);
}
}
}
foreach (TreeStructure child in parentTree.Children)
{
string[] levelsChildren = structure.Split('|');
if (!(child is null))
{
found = string.Equals(child.Name, levelsChildren[0], StringComparison.InvariantCultureIgnoreCase);
if (found)
{
break;
}
}
}
if (!found && !string.IsNullOrWhiteSpace(structure))
{
parentTree.Children.Add(CreateTree(structure, null));
}
}
}
//there are no more leafs, go out
return parentTree;
}
public TreeStructure CreateStructure(List<string> structures)
{
TreeStructure treeStructure = null;
foreach (string structure in structures)
{
int level = 0;
string[] rootChildren = structure.Split('|');
treeStructure = CreateTree(structure, treeStructure);
}
return treeStructure;
}
}
}
- Details
- Written by: Stanko Milosev
- Category: C#
- Hits: 4948
using System;
using System.Collections.Specialized;
using System.Configuration;
namespace CustomConfig
{
class Program
{
static void Main(string[] args)
{
MilosevBlogConfig links = (MilosevBlogConfig)ConfigurationManager.GetSection("milosev.com");
string homePage = ConfigurationManager.AppSettings.Get("homePage");
Console.WriteLine("Home page: " + homePage);
foreach (MilosevBlogCategoriesElement link in links.MilosevBlogInstances)
{
Console.WriteLine("Blog category: " + link.BlogCategory);
}
Console.WriteLine("Press any key...");
Console.ReadKey();
}
}
public class MilosevBlogCategoriesElement : ConfigurationElement
{
[ConfigurationProperty("BlogCategory", IsKey = true, IsRequired = true)]
public string BlogCategory
{
get
{
return (string)base["BlogCategory"];
}
set
{
base["BlogCategory"] = value;
}
}
}
public class MilosevBlogCategoriesElementCollection : ConfigurationElementCollection
{
public MilosevBlogCategoriesElement this[int index]
{
get
{
return (MilosevBlogCategoriesElement)BaseGet(index);
}
set
{
if (BaseGet(index) != null)
BaseRemoveAt(index);
BaseAdd(index, value);
}
}
protected override ConfigurationElement CreateNewElement()
{
return new MilosevBlogCategoriesElement();
}
protected override object GetElementKey(ConfigurationElement element)
{
return ((MilosevBlogCategoriesElement)element).BlogCategory;
}
}
public class MilosevBlogConfig : ConfigurationSection
{
[ConfigurationProperty("categories")]
[ConfigurationCollection(typeof(MilosevBlogCategoriesElementCollection))]
public MilosevBlogCategoriesElementCollection MilosevBlogInstances
{
get
{
return (MilosevBlogCategoriesElementCollection)this["categories"];
}
}
}
}
App.config should look like this:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="milosev.com" type="CustomConfig.MilosevBlogConfig, CustomConfig"></section>
</configSections>
<milosev.com>
<categories>
<add BlogCategory="csharp"/>
<add BlogCategory="asp.net MVC"/>
</categories>
</milosev.com>
<appSettings>
<add key="homePage" value="http://milosev.com/" />
</appSettings>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
</startup>
</configuration>
POI in App.config:
<configSections>
<section name="milosev.com" type="CustomConfig.MilosevBlogConfig, CustomConfig"></section>
</configSections>
Where MilosevBlogConfig looks like:
public class MilosevBlogConfig : ConfigurationSection
{
[ConfigurationProperty("categories")]
[ConfigurationCollection(typeof(MilosevBlogCategoriesElementCollection))]
public MilosevBlogCategoriesElementCollection MilosevBlogInstances
{
get
{
return (MilosevBlogCategoriesElementCollection)this["categories"];
}
}
}
Source code you can download from here.
- Details
- Written by: Stanko Milosev
- Category: C#
- Hits: 4007
static void Main(string[] args)
{
int[] gapNumbers = new int[] { 1, 3, 4, 7, 8, 10 };
foreach (int number in FillTheGap(gapNumbers))
{
Console.WriteLine(number);
}
Console.ReadKey();
}
private static IEnumerable<int> FillTheGap(int[] gapNumbers)
{
int prevNumber = 1;
foreach (int number in gapNumbers)
{
if (prevNumber == number)
{
yield return number;
}
else
{
for (; prevNumber < number; prevNumber++)
{
yield return prevNumber;
}
yield return number;
}
prevNumber++;
}
}
POI:
foreach (int number in FillTheGap(gapNumbers))
- Details
- Written by: Stanko Milosev
- Category: C#
- Hits: 4222
public void ResizeImage(string originalFilename, string saveTo,
int canvasWidth, int canvasHeight)
{
try
{
Image image = Image.FromFile(originalFilename);
Image thumbnail = new Bitmap(canvasWidth, canvasHeight);
Graphics graphic = Graphics.FromImage(thumbnail);
graphic.InterpolationMode = InterpolationMode.HighQualityBicubic;
graphic.SmoothingMode = SmoothingMode.HighQuality;
graphic.PixelOffsetMode = PixelOffsetMode.HighQuality;
graphic.CompositingQuality = CompositingQuality.HighQuality;
int originalWidth = image.Width;
int originalHeight = image.Height;
double ratioX = canvasWidth / (double)originalWidth;
double ratioY = canvasHeight / (double)originalHeight;
double ratio = ratioX < ratioY ? ratioX : ratioY;
int newHeight = Convert.ToInt32(originalHeight * ratio);
int newWidth = Convert.ToInt32(originalWidth * ratio);
int posX = Convert.ToInt32((canvasWidth - (originalWidth * ratio)) / 2);
int posY = Convert.ToInt32((canvasHeight - (originalHeight * ratio)) / 2);
graphic.Clear(Color.White); // white padding
graphic.DrawImage(image, posX, posY, newWidth, newHeight);
ImageCodecInfo[] info = ImageCodecInfo.GetImageEncoders();
EncoderParameters encoderParameters;
encoderParameters = new EncoderParameters(1);
encoderParameters.Param[0] = new EncoderParameter(Encoder.Quality,
100L);
int OrientationKey = 0x0112;
const int NotSpecified = 0;
const int NormalOrientation = 1;
const int MirrorHorizontal = 2;
const int UpsideDown = 3;
const int MirrorVertical = 4;
const int MirrorHorizontalAndRotateRight = 5;
const int RotateLeft = 6;
const int MirorHorizontalAndRotateLeft = 7;
const int RotateRight = 8;
if (image.PropertyIdList.Contains(OrientationKey))
{
if (image.PropertyIdList.Contains(OrientationKey))
{
var orientation = (int)image.GetPropertyItem(OrientationKey).Value[0];
switch (orientation)
{
case NotSpecified: // Assume it is good.
case NormalOrientation:
// No rotation required.
break;
case MirrorHorizontal:
thumbnail.RotateFlip(RotateFlipType.RotateNoneFlipX);
break;
case UpsideDown:
thumbnail.RotateFlip(RotateFlipType.Rotate180FlipNone);
break;
case MirrorVertical:
thumbnail.RotateFlip(RotateFlipType.Rotate180FlipX);
break;
case MirrorHorizontalAndRotateRight:
thumbnail.RotateFlip(RotateFlipType.Rotate90FlipX);
break;
case RotateLeft:
thumbnail.RotateFlip(RotateFlipType.Rotate90FlipNone);
break;
case MirorHorizontalAndRotateLeft:
thumbnail.RotateFlip(RotateFlipType.Rotate270FlipX);
break;
case RotateRight:
thumbnail.RotateFlip(RotateFlipType.Rotate270FlipNone);
break;
default:
throw new NotImplementedException("An orientation of " + orientation + " isn't implemented.");
}
}
}
//thumbnail.RotateFlip(RotateFlipType.Rotate90FlipNone);
thumbnail.Save(saveTo, info[1], encoderParameters);
Debug.WriteLine($"Thumbnail from file: {originalFilename} created in {saveTo}");
}
catch (Exception e)
{
Debug.WriteLine($"Error creating thumbnail: {e.Message}");
}
}
POI:
int OrientationKey = 0x0112;
const int NotSpecified = 0;
const int NormalOrientation = 1;
const int MirrorHorizontal = 2;
const int UpsideDown = 3;
const int MirrorVertical = 4;
const int MirrorHorizontalAndRotateRight = 5;
const int RotateLeft = 6;
const int MirorHorizontalAndRotateLeft = 7;
const int RotateRight = 8;
if (image.PropertyIdList.Contains(OrientationKey))
{
if (image.PropertyIdList.Contains(OrientationKey))
{
var orientation = (int)image.GetPropertyItem(OrientationKey).Value[0];
switch (orientation)
{
case NotSpecified: // Assume it is good.
case NormalOrientation:
// No rotation required.
break;
case MirrorHorizontal:
thumbnail.RotateFlip(RotateFlipType.RotateNoneFlipX);
break;
case UpsideDown:
thumbnail.RotateFlip(RotateFlipType.Rotate180FlipNone);
break;
case MirrorVertical:
thumbnail.RotateFlip(RotateFlipType.Rotate180FlipX);
break;
case MirrorHorizontalAndRotateRight:
thumbnail.RotateFlip(RotateFlipType.Rotate90FlipX);
break;
case RotateLeft:
thumbnail.RotateFlip(RotateFlipType.Rotate90FlipNone);
break;
case MirorHorizontalAndRotateLeft:
thumbnail.RotateFlip(RotateFlipType.Rotate270FlipX);
break;
case RotateRight:
thumbnail.RotateFlip(RotateFlipType.Rotate270FlipNone);
break;
default:
throw new NotImplementedException("An orientation of " + orientation + " isn't implemented.");
}
}
}
With this code I was checking if image has to be rotated. Example application (at this moment still under development), you can see on my GitHub.
---
UPDATE 2024-04-06
Note that Image and are I disposable, so correct way would be:
public void ResizeImage(string originalFilename, string saveTo,
int canvasWidth, int canvasHeight)
{
try
{
using (Image image = Image.FromFile(originalFilename))
using (Image thumbnail = new Bitmap(canvasWidth, canvasHeight))
using (Graphics graphic = Graphics.FromImage(thumbnail))
{
...
Otherwise image file will stay locked.