0

私は次のようなクラスを持っています:

public class LogDataRow
{
    public DateTime TheInterval { get; set; }

    public ICollection<LogPreviousCurrent> PreviousCurrentItems { get; set; }
}

これらのコレクションが含まれています:

public class LogPreviousCurrent : INotifyPropertyChanged
{
    public string Name { get; set; }

    private decimal? previous;
    public decimal? Previous
    {
        get { return previous; }
        set
        {
            previous = value;
            PropertyNotification.Notify(this, PropertyChanged, PreviousProperty);
        }
    }
    private const string PreviousProperty = "PreviousProperty";

    private decimal? current;
    public decimal? Current
    {
        get { return current; }
        set
        {
            current = value;
            PropertyNotification.Notify(this, PropertyChanged, CurrentProperty);
        }
    }
    public const string CurrentProperty = "CurrentProperty";
}

for ループを使用して、それぞれ 10 個の LogPreviousCurrent アイテムを含む LogDataRow のコレクションを作成します。各 LogPreviousCurrent には Name プロパティがあります。

for ループの例を次に示します。

    var logDataRows = new List<LogDataRow>();

        // loop through for each interval (always 24)
        for (int i = 1; i <= 24; i++)
        {
            // create a new logdatarow and intialise with the interval
            var dataRow = new logDataRow
                {
                    Interval = new Interval(customDateObject.TheDate, i)
                };

            // loop thorugh all the types (these equal columns in the destination grid)
            foreach (var type in customTypes)
            {
                // initialise a new preiovuscurrent object
                var previousCurrent = new LogPreviousCurrent
                    {
                        Name = type.Value.Name
                    };

                DetailObject latestDetails = null;
                DetailObject previousDetails = null;

                if (latest.Details.ContainsKey(type.Key))
                {
                    latestDetails = latest.Details[type.Key];
                }

                if (previous.Details.ContainsKey(type.Key))
                {
                    previousDetails = previous.Details[type.Key];
                }

                // get the latest/previous interval value for each details object
                var latestIntervalValue = latestDetails == null ? null : latestDetails.Details[i];
                var previousIntervalValue = previousDetails == null ? null : previousDetails.Details[i];

                // if there is a difference in the data
                if (latestIntervalValue != previousIntervalValue)
                {
                    previousCurrent.Previous = previousIntervalValue;
                    previousCurrent.Current = latestIntervalValue;
                }
                 else
                {
                    // no difference so set both to null
                    previousCurrent.Previous = null;
                    previousCurrent.Current = null;
                }

                dataRow.PreviousCurrentItems.Add(previousCurrent);
            }

            // only add rows that contain differences
            if (dataRow.PreviousCurrentItems.Any(a => a.Previous != a.Current))
            {
                logDataRows.Add(dataRow);
            }
        }

このループの最後に、LogPreviousCurrent の違いを含む行 (dataRow) のみのコレクションになります。

今私がやりたいことは、列についても同じです。つまり、特定の Name プロパティのすべての LogPreviousCurrent に違いが含まれていない場合、それらの LogPreviousCurrent オブジェクトは logDataRows コレクションに存在しないはずです。

したがって、本質的に最後に、LogPreviousCurrent アイテムのみを含むコレクションを返し、Previous プロパティと Current プロパティの違いを返したいと考えています。

Linq を使用してこれを実行しようとしましたが、これまでのところ成功していません。

これが理にかなっていると思いますか?

4

1 に答える 1

0

これは私が思いついたものです:

       // get all the PreviousCurrentItems across all logDataRows (flattened)
        var allPreviousCurrentItems = logDataRows.SelectMany(p => p.PreviousCurrentItems).ToList();

        // loop through all the types, again
        foreach (var type in customTypes)
        {
            var name = type.Value.Name;

            // get all the PreviousCurrentItems that match the Name
            var matchedPreviousCurrentItems = allPreviousCurrentItems.Where(p => p.Name == name);

            // if all the matched PreviousCurrentItems have pairs with no differences
            if (matchedPreviousCurrentItems.All(p => p.Previous == p.Current))
            {
                // remove the matched items from the logDataRows collection
                logDataRows.SelectMany(p => p.PreviousCurrentItems).ToList().RemoveAll(p => p.Name == name);
            }
        }

        return logDataRows;
于 2013-07-03T04:28:11.610 に答える