2017-09-14 10 views
0

二つのリストとクラスの間に時間を足しC#のマッチは、その後、私は二つのリストを持っている

public class CommonLog 
{ 
    public string Break { get; set; } 
    public string Cart { get; set; } 
    public string Length { get; set; } 
} 

これは、このリストのようなリスト1

commonlog.Add(new CommonLog { Break = breakTimeVar, Cart = cartVar, 
    Length = lengthHours }); 

と1である2

commonlog2.Add(new CommonLog { Break = breakTimeVar2, Cart = cartVar2, 
    Length = lengthHours2 }); 

私が一致させる必要がある2つの情報は、次のとおりです。

リスト1は、この

0016 009130 00:01:30 

リスト2は、この

0016 0066486 00:00:30 

0016 0050093 00:00:30 

0016 0063791 00:00:30 

は、私は2つのリストの間で最初の数0016と一致して、最後の数字〇時00分30秒を追加する必要が含まれ含まれていリスト2の最後の数字(時間)の合計がリスト1と等しいかどうかに基づいて決定する。

達成する?

+0

マッチ? –

+2

そして、文字列ではなくint/TimeSpanとして保存してみませんか? –

+1

リスト1に最初の番号の重複がありますか?もしそうなら、あなたはリスト2の合計をそれぞれと比較したいですか? – juharr

答えて

1

は、ここではRomoku応答の類似した(しかし、よりコンパクトな)方法で、2つのエントリをあなたのリストを集約LINQソリューションです:

var groupedLogs = commonlog2 
    .GroupBy(c => c.Break, c => TimeSpan.Parse(c.Length)) 
    // group logs by Break, and get the TimeSpan representation of Length 
    // for each entry of the group 
    .ToDictionary(g => g.Key, g => g.Aggregate(TimeSpan.Zero, (s, c) => s + c)); 
    // create a dictionary and aggregate each log group into sums of TimeSpans 

次に、commonlogの各項目を繰り返して、結果を比較してください:

foreach(var log in commonlog) 
{ 
    TimeSpan sum; 
    groupedLogs.TryGetValue(log.Break, out sum); 
    if(sum == TimeSpan.Parse(log.Length)) 
    { 
     // do something 
    } 
} 

それとも(C#7の機能を使用して)commonlogからのみ一致する項目を取得するために1つのライナーの方法:、または特定の値のリスト1と2のすべてのための

var matching = commonlog.Where(
    l => groupedLogs.TryGetValue(l.Break, out TimeSpan v) 
     && TimeSpan.Parse(l.Length) == v); 
+0

ありがとうございました。それは魅力的でした –

1

GroupByを使用して個々のブレークをグループ化し、集約ブレークをループして一致するものを見つけることができます。

個々の休憩を合計すると、Aggregateがあります。

Lengthの代わりにstringの代わりにTimeSpanを使用することをおすすめします。

データ

var totalBreaks = new List<CommonLog> 
{ 
    new CommonLog 
    { 
     Break = "0016", 
     Cart = "009130", 
     Length = "00:01:30" 
    } 
}; 

var individualBreaks = new List<CommonLog> 
{ 
    new CommonLog 
    { 
     Break = "0016", 
     Cart = "0066486", 
     Length = "00:00:30" 
    }, 
    new CommonLog 
    { 
     Break = "0016", 
     Cart = "0050093", 
     Length = "00:00:30" 
    }, 
    new CommonLog 
    { 
     Break = "0016", 
     Cart = "0063791", 
     Length = "00:00:30" 
    } 
}; 

ロジック

//Group the individual breaks by their Break 
var breakGroups = individualBreaks.GroupBy(x => x.Break); 

// Loop through the aggregates 
foreach (var totalBreak in totalBreaks) 
{ 
    // Match the aggregate to the individual 
    // The Key is the Break for all individual breaks in the group 
    var breaks = breakGroups.FirstOrDefault(x => x.Key == totalBreak.Break); 

    // Do we have a match? 
    if (breaks == null) 
    { 
     continue; 
    } 

    var breakLength = TimeSpan.Parse(totalBreak.Length); 
    // Add up the individual breaks with Aggregate 
    var breakTotal = 
     breaks 
      .Aggregate(
       TimeSpan.Zero, // Initial break is 00:00:00 
       (time, b) => // Add each break to the initial 
        time.Add(TimeSpan.Parse(b.Length))); 

    // Does the break length match the total number of breaks? 
    if (breakLength == breakTotal) 
    { 
    } 
} 
関連する問題