Показаны сообщения с ярлыком code. Показать все сообщения
Показаны сообщения с ярлыком code. Показать все сообщения

вторник, 9 февраля 2010 г.

Linq: Как получить из одного списка объектов пронумерованный?

Возникла задача получить из списка объектов (IList<People>) другой, а именно пронумерованный (IDictionary<int,People>). Те получить некоторый аналог ROWNUM (Oracle) или ROWNUMBER (MS SQL Server).

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Linq.test
{
class Program
{
static void Main(string[] args)
{
// источник записей
var mans = new[] {
new People { Name = "John", Age = 23 },
new People { Name = "Bob", Age = 12 },
new People { Name = "Bill", Age = 43 },
new People { Name = "Patrick", Age = 69 }
};

// посмотрим что там в списке ;-)
foreach (var man in mans)
{ Console.WriteLine(man.ToString()); }

// получаем проиндексированный список
var counteredMan = GetIndexed(mans);

// собственно выводим его в консоль
foreach (var item in counteredMan)
{ Console.WriteLine(item.Key + " - " + item.Value); }

Console.ReadLine();
}

/// <summary>
///
Получение пронумерованного списка
/// </summary>
/// <param name="pupils"></param>
/// <returns></returns>
private static IDictionary<int, People> GetIndexed(IEnumerable<People> pupils)
{
return pupils.Select((man, i) => new
{
id = i+1,
man = man
}).ToDictionary(key => key.id, val => val.man);
}
}

/// <summary>
///
Объект для опытов
/// </summary>
public class People
{
public string Name { get; set; }
public int Age { get; set; }

public override string ToString()
{ return "Гражданин " + Name + ", возраст: " + Age; }
}
}

пятница, 28 августа 2009 г.

ASP.NET MVC: DropDownList

При редактировании некоторых полей объекта очень часто необходимо использование контрола DropDownList. А чтоб его заполнить данными нужен объект типа IEnumerable.

Для примера понадобятся слудующие сущности EmployeeEntity, JobEntity

public class EmployeeEntity
  {
    public virtual int EmployeeId { get; set;}
    public virtual string FirstName { get; set; }
    public virtual string LastName { get; set; }
    public virtual String JobId { get; set; }
  }


* This source code was highlighted with Source Code Highlighter.


public class JobEntity
  {
    public virtual string JobId { get; set; }
    public virtual string JobTitle { get; set; }
  }


* This source code was highlighted with Source Code Highlighter.


Что бы удобно передать во View модель данных содержащую как экземпляр Employee так и список Job`ов создаем класс обертку:
public class EmployeeEditViewData
  {
    public EmployeeEntity Employee;
    public IEnumerable<SelectListItem> Jobs;
  }


* This source code was highlighted with Source Code Highlighter.


Теперь необходимо создать Action для Employee контроллера
  1. public ActionResult Edit(int id)
  2.     {
  3.       EmployeeEntity employeeEntity = _employeeRepository.EditById(id);
  4.       IEnumerable<SelectListItem> jobs =
  5.         Domain
  6.         .CurrentSession
  7.         .CreateCriteria<Job>()
  8.         .List<Job>()
  9.         .Select(j => new SelectListItem
  10.                  {
  11.                    Text = j.JobTitle,
  12.                    Value = j.JobId,
  13.                    Selected = employeeEntity.JobId == j.JobId
  14.                  });
  15.  
  16.       EmployeeEditViewData viewData = new EmployeeEditViewData
  17.                         {
  18.                           Employee = employeeEntity,
  19.                           Jobs = jobs
  20.                         };
  21.       return View("Edit", viewData);
  22.     }
* This source code was highlighted with Source Code Highlighter.

А теперь по порядку:
строка 3 - получение экземляра объекта EmployeeEntity;
строки 4-14 - получение экземляра IEnumerable Jobs;
строки 16-20 - создаем EmployeeEditViewData и инициализируем поля ранее получеными объектами;

Для данного action необходимо создать строго типизированную view на основе класса EmployeeEditViewData. У меня студийный генератор не смог сгенерить заготовку view для редактирования полей, но ничего не мешает это сделать самому.
Для поля в котором нам понадобится DropDownList пишем следующий код:
    <p>
      <label for="JobId">
        Job:</label>     
      <%= Html.DropDownList("JobId",Model.Jobs) %>      
    </p>


* This source code was highlighted with Source Code Highlighter.


В общем то все.

понедельник, 8 июня 2009 г.

.NET: Отладка приложений / сервисов

Замечательная штука отладчик. Не раз задумывался над проблемой отладки куска кода выполняемого при запуске приложения или сервиса. И вот нашел решение.
Вставляем код там где нужно зацепиться отладчиком, как только среда выполнения выполнит его появиться любимый диалог.


C#:
if (!Debugger.IsAttached) Debugger.Break();
* This source code was highlighted with Source Code Highlighter.

VB.NET:
If Not Debugger.IsAttached Then
  Debugger.Break()
End If

* This source code was highlighted with Source Code Highlighter.

понедельник, 1 июня 2009 г.

DateTime.ToString и "/" подстава

задолбался
      DateTime dt = DateTime.Now;
      Trace.WriteLine("ToString() - " + dt.ToString());
      Trace.WriteLine("dd/MM/yyyy HH:mm - " + dt.ToString("dd/MM/yyyy HH:mm"));
      Trace.WriteLine("dd[MM[yyyy HH^mm - " + dt.ToString("dd[MM[yyyy HH^mm"));
      Trace.WriteLine(@"dd\/MM\/yyyy HH:mm - " + dt.ToString(@"dd\/MM\/yyyy HH:mm"));
      Trace.WriteLine("System.Globalization.DateTimeFormatInfo.CurrentInfo.DateSeparator - " +
        System.Globalization.DateTimeFormatInfo.CurrentInfo.DateSeparator);


* This source code was highlighted with Source Code Highlighter.


Output:
ToString() - 01.06.2009 15:44:54
dd/MM/yyyy HH:mm - 01.06.2009 15:44
dd[MM[yyyy HH^mm - 01[06[2009 15^44
dd\/MM\/yyyy HH:mm - 01/06/2009 15:44
System.Globalization.DateTimeFormatInfo.CurrentInfo.DateSeparator - .

Спрашивается чем слеш(/) неугодил?

четверг, 29 января 2009 г.

Как сделать скриншот программы?

How to take ScreenShot in C# or Visual Basic?

C#
using System.Drawing;
using System.Drawing.Imaging;
using System.Windows.Forms;

private string TakeScreenShotFileName()
    {
      string screenshot = null;

      if (Application.OpenForms.Count > 0)
      {
        Bitmap bmp;
        Graphics gr;
        Rectangle bounds = Application.OpenForms[0].Bounds;

        screenshot = System.IO.Path.GetTempFileName();

        bmp = new Bitmap(bounds.Width, bounds.Height);

        gr = Graphics.FromImage(bmp);
        gr.CopyFromScreen(Application.OpenForms[0].Location, Point.Empty, bounds.Size);

        bmp.Save(screenshot, ImageFormat.Jpeg);
      }

      return screenshot ?? "";
    }


* This source code was highlighted with Source Code Highlighter.


VB
Imports System.Drawing
    Private Function TakeScreenshotFileName() As String
      Dim bounds As Rectangle = My.Application.MainForm.Bounds
      Dim fileNAme As String = Nothing

      Using b As New Bitmap(bounds.Width, bounds.Height)
        Using g = Graphics.FromImage(b)
          g.CopyFromScreen(My.Application.MainForm.Location, Point.Empty, bounds.Size)
        End Using
        fileNAme = System.IO.Path.GetTempFileName()
        b.Save(fileNAme, Imaging.ImageFormat.Jpeg)
      End Using
      Return fileName
    End Function


* This source code was highlighted with Source Code Highlighter.

четверг, 30 октября 2008 г.

Oracle: Макcимальное количество аргументов хранимой процедуры?

Вопрос возник не на пустом месте, в ходе отладки чужого кода наткнулся на PL/SQL процедуры количество аргументов которых варьировалось от 120 до 190.
Читать текст с объявлением или вызовом такой процедуры весьма нудное занятие, про дебаг и говорить не стоит.

В руководстве слушателя "Oracle Database 10g: Основы PL/SQL" том 1, [9-5] в разделе про синтаксис процедуры написано слудующее:
аргумент - Имя, даваемое параметру процедуры. С каждым аргументом связан
тип_параметра (mode) и тип данных. Допускается любое
количество аргументов, разделенных запятыми.

На самом деле это не так!

Проверка
Выполняем следующий скрипт:
set termout off
store set sqlplus.cfg replace
set pagesize 0
set linesize 10000
set tab off
set trimspool on
set echo off
set verify off
set feedback off
set timing off
set recsep off
spool p_test.sql

SELECT  'create or replace procedure p (' FROM DUAL
/
WITH a AS (  SELECT  LEVEL b
         FROM  DUAL
      CONNECT BY  LEVEL <= 8191)
SELECT  ' p' || b || ' in number,'
 FROM  a
/
SELECT   ' p in number'
     || CHR (10)
     || ' ) as'
     || CHR (10)
     || 'begin'
     || CHR (10)
     || ' null;'
     || CHR (10)
     || 'end;'
     || CHR (10)
     || '/'
 FROM  DUAL
/
spool off
@sqlplus.cfg
set termout on
@p_test.sql


* This source code was highlighted with Source Code Highlighter.


результат:
D:\sqlplus srv@vm @test.sql

SQL*Plus: Release 10.2.0.1.0 - Production on Thu Oct 30 17:48:33 2008

Copyright (c) 1982, 2005, Oracle. All rights reserved.

Enter password:

Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options


Warning: Procedure created with compilation errors.

SQL> show errors;
Errors for PROCEDURE P:

LINE/COL ERROR
-------- -----------------------------------------------------------------
1/0 PLS-00123: program too large (Diana nodes)
SQL>


А вот создать процедуру с 8187 аргуметами вполне возможно.

Если все таки нужно передать много параметров в процедуру или функцию лучше воспользоваться советом Томаса Кайта.

Ссылки:
1. How many parameters can a stored procedure have?
2. PL/SQL User's Guide and Reference Release 2 (9.2) - PL/SQL Program Limits
3. Oracle® Database PL/SQL User's Guide and Reference 10g Release 2 (10.2) - C PL/SQL Program
Limits

4. Writing a function which accepts unlimited parameters

среда, 22 октября 2008 г.

How to export EventLog in .evt format

Как сделать экспорт журналов событий в evt формат из C# 2.0?
Занадобилось мне сделать утиль, чтоб у пользователей логи забирать и не тратить свое время на объяснение чего и откуда экспортировать.
Сделал только для System и Application журналов, добавить остальные не проблема, знаючи...
Собственно:
using System;
using System.IO;
using System.Runtime.InteropServices;

namespace LogHarvester
{
  class Program
  {
    [DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Auto)]
    static extern bool BackupEventLog(IntPtr hEventLog, string backupFile);

    // OpenEventLog PInvoke overloaded call supporting full parameters.
    [DllImport("advapi32.dll", SetLastError = true, EntryPoint = "OpenEventLog")]
    public static extern IntPtr OpenEventLog(
             [MarshalAs(UnmanagedType.LPStr)] String lpUNCServerName,
             [MarshalAs(UnmanagedType.LPStr)] String lpSourceName);

    static void Main()
    {
      BackupEventLog(OpenEventLog(null, "Application"), Path.Combine(Environment.CurrentDirectory, "application.evt"));
      BackupEventLog(OpenEventLog(null, "System"), Path.Combine(Environment.CurrentDirectory, "system.evt"));
    }
  }
}

* This source code was highlighted with Source Code Highlighter.