3

私は次のタイプを持っています:

public class Parts
{
    public string PartNo { get; set; }
    public decimal Price { get; set; }
}

私がやりたいのは、価格または各部品を最も安いものと比較し、その差をパーセンテージで表示することです。

これは私がこれまでに試したことであり、動作します:

        var part1 = new Part {PartNo = "part1", Price = 10};
        var part2 = new Part {PartNo = "part1", Price = 8};
        var part3 = new Part {PartNo = "part1", Price = 12};

        var parts = new List<Part> {part1, part2, part3};

        var list = from p in parts
                    orderby p.Price ascending 
                   select p;

        var sb = new StringBuilder();

        var counter = 0;
        decimal firstPrice=0;
        foreach (Part p in list)
        {
            if (counter == 0)
            {
                firstPrice = p.Price;
            }

            sb.Append(p.PartNo + ": " + p.Price + "," + ((p.Price/firstPrice)-1)*100 + Environment.NewLine);

            counter++;
        }


        Console.WriteLine(sb.ToString(), "Parts List");

これにより、次が出力されます。

part1: 8, 0
part1: 10, 25.00
part1: 12, 50.0

これは各パーツの価格上昇を示しています。それが私が達成しようとしているものですが、価格差をパーセンテージで計算するより良い方法があるのではないかと考えていました (LINQ クエリなどを使用) またはその他の方法で。

ありがとう

4

3 に答える 3

3

最初のステップとして差を計算します。

var cheapestPrice = parts.Min(p => p.Price);
var list = parts.Select(p => new { 
    Part = p,
    DiffPercentage = ((p.Price - cheapestPrice) / cheapestPrice) * 100 
});

foreach (var p in list)
    Console.WriteLine("{0}: {1},{2}%", p.Part.PartNo, p.Part.Price, p.DiffPercentage);
于 2012-11-21T15:07:25.960 に答える
2
// list defined as sorted by price ascending as per the code
var list = parts.OrderBy(p => p.Price); // less verbose way of saying the same

var firstPrice = list.First().Price;
var differences = list.Skip(1).Select(s => new {Part = s, PercentageDiff = (s.Price/firstPrice - 1)*100});

.Skip(1)オプションです。最安値をそれ自体と比較したくない場合があります。

于 2012-11-21T15:11:18.870 に答える
1

ティムは私を打ち負かしましたが、選択を使用して文字列を作成します

void Main()
{
        var part1 = new Part {PartNo = "part1", Price = 10};
        var part2 = new Part {PartNo = "part1", Price = 8};
        var part3 = new Part {PartNo = "part1", Price = 12};

        var parts = new List<Part> {part1, part2, part3};

        var lowest = parts.Min(p => p.Price );

        var result = parts.Select (p => string.Format("Part #:{0} {1} -> {2}", p.PartNo, p.Price,  ((p.Price/lowest)-1)*100 ));

      result.ToList()
            .ForEach(rs => Console.WriteLine (rs));
        /*
Part #:part1 10 -> 25.00
Part #:part1 8 -> 0
Part #:part1 12 -> 50.0
*/


}

// Define other methods and classes here
public class Part
{
    public string PartNo { get; set; }
    public decimal Price { get; set; }
}
于 2012-11-21T15:11:02.687 に答える