月別アーカイブ: 2011年7月

【LINQ】指定の条件に一致しない場合、空の要素を生成するには(Empty生成演算子)

// データ
int[] array1 = { 50, 60, 70 };
int[] array2 = { 1, 2, 3 };
int[] array3 = { 5, 10, 15 };

// IEnumerableインターフェースを実装したリストに変換
var lists = new List<IEnumerable<int>> 
                { 
                    array1.AsEnumerable(), 
                    array2.AsEnumerable(), 
                    array3.AsEnumerable()
                };

// 各リスト毎に平均値が10より小さい場合は、空の要素を生成
var query = lists.Aggregate(Enumerable.Empty<int>(),
            (current, next) => next.Average() >= 10
                ? current.Union(next) : current);

// 結果 ⇒ 50, 60, 70, 5, 10, 15

広告

【LINQ】指定の個数分の要素一覧を生成するには(Repeat生成演算子)

// データ
string[] userArray = { "Taro", "Jiro", "Saburo", "Shiro", "Goro" };

// userArrayを3つ生成
var query = Enumerable.Repeat((from user in userArray select user), 3);

// 結果 ⇒ [0] : "Taro", "Jiro", "Saburo", "Shiro", "Goro"
//        [1] : "Taro", "Jiro", "Saburo", "Shiro", "Goro"
//        [2] : "Taro", "Jiro", "Saburo", "Shiro", "Goro"

【LINQ】指定のデータ型へ変換(キャスト)するには(Cast変換演算子)

public interface IMessage
{
    void Show();
}

public class Message : IMessage
{
    public int id { get; set; }
    public string message { get; set; }

    public void Show()
    {
        Console.WriteLine(this.message);
    }
}

// データ            
Message[] messages
    = {
        new Message { id = 0, message = "C#" },
        new Message { id = 1, message = "F#" },
        new Message { id = 2, message = "VB.NET" },
        new Message { id = 3, message = "C++" },                    
        };

// IMessageインタフェースに変換
// クエリ式の場合
var query = (from message in messages
                select message).Cast<IMessage>();
foreach (var msg in query) { msg.Show(); } 

// ラムダ式の場合
var lambda = messages.Select(s => s).Cast<IMessage>();
foreach (var msg in lambda) { msg.Show(); } 

【LINQ】Lookup<TKey, TElement> 型(1つのキーに複数の値)に変換するには(ToLookup変換演算子)

public class User
{
    public int groupId { get; set; }
    public string name { get; set; }
}

User[] users
    = {
        new User { groupId = 0, name = "Taro" },
        new User { groupId = 0, name = "Jiro" },
        new User { groupId = 1, name = "Saburo" },
        new User { groupId = 1, name = "Shiro" },
        new User { groupId = 2, name = "Goro" }
      };

// クエリ式の場合
var query = (from user in users
             select user).ToLookup<User, int>(s => s.groupId);

// ラムダ式の場合
var lambda = users.Select(s => s).ToLookup<User, int>(s => s.groupId);

IEnumerable<User> groupList;
groupList = query[0];
// 結果 ⇒ [group = 0, Value = Taro]
//      , [group = 0, Value = Jiro]

groupList = query[1];
// 結果 ⇒ [group = 1, Value = Saburo]
//      , [group = 1, Value = Shiro]

groupList = query[2];
// 結果 ⇒ [group = 2, Value = Goro]

【LINQ】Dictionary<TKey, TValue> 型に変換するには(ToDictionary変換演算子)

// データ
string[] userArray = { "Taro", "Jiro", "Saburo"};

// クエリ式の場合
int id = 0;
var query = (from user in userArray
             select new { id = id++, name = user })
                .ToDictionary(s => s.id);

// ラムダ式の場合
int id2 = 0;
var lambda = userArray.Select(user => new { id = id2++, name = user })
                .ToDictionary(s => s.id);

// 結果 ⇒ [Key = 0, Value = Taro]
//      , [Key = 1, Value = Jiro]
//      , [Key = 2, Value = Saburo]