2016-08-10 13 views
0

C#でヘルプを探していて、辞書と整数(シフトサイズ)を受け入れる方法を書いています
値は指定されたサイズだけ右にシフトされます。 ここがその例です。 辞書はこのように見えます。C#LInqで指定されたサイズで辞書の内容を新しい辞書に移動

01/01/2015 --- 100 
02/01/2015 --- 150 
03/01/2015 --- 200 

コード:

IDictionary<DateTime, int> inputDic = new Dictionary<DateTime, int>(); 
inputDic.Add(new DateTime(2015, 01, 01), 100); 
inputDic.Add(new DateTime(2015, 02, 01), 150); 
inputDic.Add(new DateTime(2015, 03, 01), 200); 

public static IDictionary<DateTime, int> ShiftContent(
     this IDictionary<DateTime, int> inputDictionary, int size) 
    { 
     //shifting logic; 
     return outputDictionary; 

    } 

サイズが2であれば、出力辞書は以下のように値を入れておく必要があります。日付はmm/dd/yyyyです。

01/01/2015 --- 0 
02/01/2015 --- 0 
03/01/2015 --- 100 
04/01/2015 --- 150 
05/01/2015 --- 200 

ご協力いただきまして誠にありがとうございます。仕事をするだろう

+2

「右にシフト」を、ハァッ?右シフトは簡単です: 'n >> = 2'。やってみて。あなたは何をしようとしましたか?あなたは誰かにあなたが問題を解決するのを助けるように頼んでいるのですか、誰かにあなたのコードを書くように頼んで涙を流していますか? –

答えて

1

これはまだ1つのみLINQクエリ使用して、別の方法である:

public static IDictionary<DateTime, int> ShiftContent(
     this IDictionary<DateTime, int> inputDictionary, int size) 
{  
    return 
     Enumerable.Range(1, size).Select(value => new KeyValuePair<DateTime, int>(inputDictionary.First().Key.AddMonths(value - 1), 0))  
     .Union(inputDictionary.ToList().Select(value => new KeyValuePair<DateTime, int>(value.Key.AddMonths(size), value.Value))) 
     .ToDictionary(kvp => kvp.Key, kvp => kvp.Value); 
} 
+0

ありがとうございました。感謝します。素晴らしい仕事をした。 – Raaz

1

public static IDictionary<DateTime, int> ShiftContent(
     this IDictionary<DateTime, int> inputDictionary, int size) 
{ 
    var minDate = inputDictionary.Keys.Min(); 
    var result = inputDictionary.ToDictionary(a => a.Key.AddMonths(size), a => a.Value); 
    for (int i = 0; i < size; i++) 
     result[minDate.AddMonths(i)] = 0; 
    return result; 
} 
+0

Powelありがとうございます。出来た。私は注文を維持するためにreturn文にわずかな変更を加えました。 – Raaz

0

正確に何をしたい行うためのforeachを作成するのは非常に簡単だろうが、以下のLINQソリューションです。あなたがする必要がどのような

は次のとおりです。

  • はあなたのリストに追加する必要が新しい日付のリストを作成します。
  • このリストを元のリストに追加してください。
  • 結合リストを照会し、単純な条件を実行して、要素が0であるか、またはシフトされた要素であるかを確認します。
  • ディクショナリに要素があるかどうかを確認し、循環シフト(シフト> =カウントまたはカウントの倍数)がある場合は、チェックを追加する必要があります。

以下は、それを正しく行うには、あなたの道を開く必要があります。

var last = inputDic.Keys.LastOrDefault(); 
int skipped = inputDic.Count - shift; 
var tobeAdded = inputDic.Skip(skipped).Select((item, index) => new 
               KeyValuePair<DateTime, int> 
               (last.AddMonths(index + 1), 
               inputDic.Values.ElementAt(skipped + index))); 

int counter = 0; 
var result = (from kv in inputDic.AsEnumerable().Concat(tobeAdded) 
       let value = counter <= shift - 1 ? 0 : inputDic.Values.ElementAt(counter - shift) 
       let dummy = counter++ 
       select Tuple.Create(kv.Key, value)) 
       .ToDictionary(x => x.Item1, x => x.Item2); 
+0

明確な手順をありがとうございました。これは私にアプローチする方法を明確にします。 – Raaz

関連する問題