Το «@», η C# και τα keywords

Στην αναζήτηση μου για ένα pattern (άσχετο), διάβασα ότι μπορούμε να χρησιμοποιήσουμε το «@» ως πρόθεμα στη C#
έτσι ώστε να μπούμε να δηλώνουμε μεταβλητές, κλάσεις κτλ. με «δεσμευμένες λέξεις».

 

π.χ.

string @string = "test string";
bool @bool = true;
 

 

Σχετικό Link

3 σχόλια

Μια νέα «HasChanges»

Υπάρχουν περιπτώσεις που η μέθοδος HasChanges του DataSet δεν λειτουργεί σωστά.
Δηλαδή επιστρέφει πάντα true, παρότι δεν έχουν γίνει αλλαγές στο DataSet.

 

public static class DataSetUtils
{
/// <summary>
/// Gets a value indicating whether the DataSet has changes, including new, deleted, or modified rows.
/// </summary>
/// <param name="dataSet"></param>
/// <returns>true if the DataSet has changes; otherwise false.</returns>
public static bool HasChanges(DataSet dataSet) {
   if (dataSet == null) return false;
   for (int table = 0; table < dataSet.Tables.Count; table++) {
      for (int row = 0; row < dataSet.Tables[table].Rows.Count; row++) {
         for (int col = 0; col < dataSet.Tables[table].Columns.Count; col++) {
            if (dataSet.Tables[table].Columns[col].ColumnName == "ModifiedDate") continue;
            if (dataSet.Tables[table].Columns[col].ColumnName == "ModifiedUser") continue;
            if (dataSet.Tables[table].Rows[row].RowState == DataRowState.Added) return true;
            if (dataSet.Tables[table].Rows[row].RowState == DataRowState.Deleted) return true;
            if (!dataSet.Tables[table].Rows[row][col, DataRowVersion.Original].Equals(dataSet.Tables[table].Rows[row][col, DataRowVersion.Current])) return true;
         }
      }
   }
   return false;
   }
}

0 σχόλια

Αντιγραφή ενός DataRow σε ένα νέο μέσα στον ίδιο πίνακα

public static class DataRowExtra
{
/// <summary>
/// Αντιγραφή ενός DataRow σε ένα νέο μέσα στον ίδιο πίνακα (Προϋπόθεση είναι το dataTable να έχει (int)Id και να είναι AutoIncrement)
/// </summary>
/// <param name="dataTable">Δίνουμε το DataTable</param>
/// <param name="dataRow">Δίνουμε το DataRow που θέλουμε να αντιγράψουμε</param>
/// <remarks>Usage: DataRowClone(tableName, dataRow)</remarks>
/// <returns>Επιστρέφει το νέο DataRow</returns>
public static DataRow Clone(DataTable dataTable, DataRow dataRow) {
   if (dataTable == null || dataRow == null) return null;
   int newId = 0, position = dataTable.Rows.Count;
   object[] newDataRow = dataRow.ItemArray;
   foreach (DataColumn dc in dataTable.Columns) {
      if (!dc.AutoIncrement) continue;
      foreach (DataRow dr in dataTable.Rows) 
         if ((int)(dr[dc.Ordinal]) < newId) newId = (int)(dr[dc.Ordinal]);
      newDataRow[dc.Ordinal] = newId - 1;
      break;
   }
   dataTable.Rows.Add(newDataRow);
   return dataTable.Rows[position];
   }
}

0 σχόλια

Machine birth mechanism

Μπορεί μια μηχανή να γεννάει;
Η απάντηση είναι περισσότερο φιλοσοφική παρά μια τεχνική εφαρμογή της ιδέας.



using System;
using System.Collections.ObjectModel;
using System.Globalization;
using System.Text;
using MachineBirthMechanism.Properties;

namespace MachineBirthMechanism
{
    public enum Gender : int
    {
        Male = 0,
        Female = 1
    }

    public class Machine
    {
        string name;
        DateTime dayOfBirth;
        Gender sex;
        Machine partner;
        Machine newBaby;
        Collection<Machine> children;
        Random random;

        Machine() {
        }
        public Machine(string name, Gender gender) {
            DayOfBirth = DateTime.Now;
            this.name = name;
            sex = gender;
        }
        public DateTime DayOfBirth {
            get { return dayOfBirth; }
            private set { dayOfBirth = value; }
        }
        public Gender Sex {
            get { return sex; }
            private set { sex = value; }
        }
        public string Name {
            get { return name; }
            set { name = value; }
        }
        public Machine Partner {
            get { return partner; }
            set { partner = value; }
        }
        public Collection<Machine> Children {
            get { return children; }
        }
        public Machine NewBaby {
            get { return newBaby; }
            private set { newBaby = value; }
        }
        public bool BornNewBaby() {
            if (partner == null) return false;
            if (children == null) children = new Collection<Machine>();
            if (random == null) random = new Random(unchecked((int)DateTime.Now.Ticks));
            NewBaby = new Machine();
            NewBaby.DayOfBirth = DateTime.Now;
            NewBaby.Name = Guid.NewGuid().ToString().Substring(0, 4);
            NewBaby.Sex = random.Next((int)Gender.Male, (int)Gender.Female + 1) == 0 ? Gender.Male : Gender.Female;
            Children.Add(NewBaby);
            return true;
        }
        public override string ToString() {
            StringBuilder elements = new StringBuilder();
            elements.AppendLine(FormatElements(this));
            if (partner != null) elements.AppendLine(FormatElements(partner));
            elements.AppendLine();
            if (children != null) {
                foreach (Machine child in children)
                    elements.AppendLine(FormatElements(child));
            }
            return elements.ToString();
        }
        static string FormatElements(Machine machine) {
            return string.Format(CultureInfo.CurrentCulture, Resources.FormatElements, machine.Name, machine.Sex, machine.DayOfBirth);
        }
    }
}

 

Και ένα παράδειγμα


using System;

namespace MachineBirthMechanism
{
    internal class Program
    {
        static void Main() {
            Machine george = new Machine("George", Gender.Male);
            george.Partner = new Machine("Foto", Gender.Female);

            if (george.BornNewBaby()) george.NewBaby.Name = george.NewBaby.Sex == Gender.Male ? "Jim" : "Rania";
            if (george.BornNewBaby()) george.NewBaby.Name = george.NewBaby.Sex == Gender.Male ? "Vag" : "Dimitra";
            if (george.BornNewBaby()) george.NewBaby.Name = george.NewBaby.Sex == Gender.Male ? "Alex" : "Matilda";

            Console.WriteLine(george.ToString());
        }
    }
}

source code

 

0 σχόλια

System.Collections.ObjectModel.Collection<Τ> & AddRange

Μίας και System.Collections.ObjectModel.Collection<Τ> δεν έχει τη μέθοδο AddRange τη πρόσθεσα και παραθέτω το κώδικα:

using System.Collections.Generic;

namespace MyCompany.SystemExtra.CollectionsExtra.ObjectModelExtra
{
    /// <summary>
    /// Provides the base class for a generic collection.
    /// Support AddRange method.
    /// </summary>
    /// <typeparam name="T">The type of elements in the collection.</typeparam>
    public class Collection<T> : System.Collections.ObjectModel.Collection<T>
    {
        /// <summary>
        /// Adds the elements of the specified collection to the end of the Collection.
        /// </summary>
        /// <param name="elements">The collection whose elements should be added to the end of the Collection. 
        /// The collection itself cannot be a null reference (Nothing in Visual Basic),
        /// but it can contain elements that are a null reference (Nothing in Visual Basic),
        /// if type T is a reference type.</param>
        public void AddRange(IEnumerable<T> elements) {
            if (elements == null) return;
            foreach (T element in elements)
                Add(element);
        }
    }
}

0 σχόλια

KENIX Application Builder Freeware Edition v1.0

Συχνά μια εφαρμογή αποτελείται από πολλά solutions και το κάθε solution από πολλά projects.

Επόμενος όταν θέλουμε να κάνουμε μαζικά build όλα τα solutions ή μερικά από αυτά, δεν είναι και ότι πιο εύκολο υπαρχή.

Η «KENIX Application Builder» είναι μια εφαρμογή που λύνει αυτό το πρόβλημα.

Δηλαδή του μαζικού build των solutions.

 

Δυνατότητες:

Ø       Build C# & VB projects

Ø       Build & Rebuild solutions

Ø       Επιλογή όλων & επιλεκτική επιλογή solutions

Ø       Order number για την διαδικασία του build

Ø       Name για κάθε solution

Ø       Group name για κάθε solution

Ø       Destination φάκελο για την μεταφορά των assemblies

Ø       Exclude project από συγκεκριμένο solution (π.χ. UnitTests projects, BuildSupport project, WindowsApplication1 project, κτλ). Έτσι ώστε να υπάρχει καθυστέρηση κατά την διάρκεια του building.

Ø       Διαχωρισμός των «Class Library» solutions από τα «Applications» solutions, έτσι ώστε να στο «Application» destination φάκελο να αντιγράφονται όλα τα σχετικά assemblies που έχει το «Application».

Ø       Η αποθήκευση γίνεται σε xml αρχείο σύνολο από solutions (*.kab).

Ø       Command line support «KENIXApplicationBuilder.exe %1»

Ø       Source code

 

 

Ερχόμενες δυνατότητες:

Ø       Pre-build events

Ø       Post-build events

Ø       File association (*.kab).

Ø       Help manual (Εάν ήθελε κάποιος να βοηθήσει, ας επικοινωνήσει μαζί μου geob@kenix.gr)

 

Η εφαρμογή «KENIX Application Builder» έχε περάσει όλα τα test του φοβερού και τρομερού Microsoft FxCop v1.35.

Οποιαδήποτε συμβουλή σε οποιοδήποτε θέμα θα ήταν ευπρόσδεκτη.

 

Download: KENIX Application Builder Freeware Edition v1.0 (περίπιου 2MB)

 

Καλά μαζικά builds.

0 σχόλια

Πρώτα από όλα ένα ευχαριστώ στο dotNETZone.gr...

Θα ήθελα να ευχαριστήσω πρώτα από όλα, όλους τους ανθρώπους που είναι στην διαχείριση του forum για την φιλοξενία του δικό μου blog.

 

Λέγομε Γιώργος Μπακογιάννης και στο www.dotNETZone.gr το nick name μου είναι baburanos.

 

Θα ασχοληθώ στο blog, με το .NET περιβάλλον και γενικά με την πλατφόρμα της Microsoft την όποια την έχουμε υιοθετήσει και στην εταιρεία μας (www.kenix.eu).

 

Αυτά για την αρχή, καλή μας διαδρομή...

 

1 σχόλια