0

次の問題があり、助けを求めたいと思います。個別の値 (1 つのプロパティによる基準) を選択し、残りのプロパティから異なる値を抽出する必要があります。

次のクラスがあり、それぞれにと が異なるBOMが 1 つ以上あるとします。FlatComponentsPartsQtyPer

例:

public sealed class BOM {
    public string FlatComponent {
        get;
        set;
    }

    public string Part {
        get;
        set;
    }

    public string QtyPer {
        get;
        set;
    }

    public BOM(String flatComponent, String part, String qtyPer) {
        this.FlatComponent=flatComponent;
        this.Part=part;
        this.QtyPer=qtyPer;
    }
}

List<BOM> list=new List<BOM>();
list.Add(new BOM("a", "1", "2"));
list.Add(new BOM("a", "3", "4"));
list.Add(new BOM("b", "5", "6"));
list.Add(new BOM("c", "7", "8"));
list.Add(new BOM("c", "9", "0"));

FlatComponentsLINQ (カンマ区切り) を使用して、各プロパティで個別の値とその異なる値を選択するにはどうすればよいですか?

結果 = [
    [「a」、「1、3」、「2、4」]、
    ["b", "5", "6"],
    [「c」、「7、9」、「8、0」]
    ]

を使用してみ.Distinct()ましたが、LINQ はかなり新しいものです ...

4

4 に答える 4

1

これを試して:

var result = list
    .GroupBy(e => e.FlatComponent)
    .Select(e => new BOM
        {
            FlatComponent = e.Key,
            Part = string.Join(", ", e.Select(x => x.Part)),
            QtyPer = string.Join(", ", e.Select(x => x.QtyPer))
        });

とプロパティをで結合して、個別BOMの for eachを作成します。FlatComponentPartQtyPer", "

于 2013-04-01T22:52:57.153 に答える
0

単一の式ですべてを実行する方法は思いつきませんでしたが (それでも理解できるようにする方法はありません)、必要なことを実行するコードを次に示します。

[編集: part と qty が単一の文字列であることに気付かなかったので、それが変更されました:]

var groups = list.GroupBy(item => item.FlatComponent);
List<List<string>> result = new List<List<string>>();

foreach (var group in groups) {
    var current = new List<string>();
    current.Add(group.Key);
    current.AddRange(group.Select(grp => string.Format("{0}, {1}", grp.Part, grp.QtyPer)));
    result.Add(current.Distinct().ToList());
}
于 2013-04-01T22:47:49.473 に答える
0

多くの場合、 を使用して LINQ で個別の操作を実行できますGroupBy。これにより、目的の結果に対して指定した形式で結果が生成されます。

IEnumerable<string[]> asEnumerable = list.GroupBy(bom => bom.FlatComponent).Select(grouping => new string[] { grouping.Key, string.Join(", ", grouping.Select(bom => bom.Part)), string.Join(", ", grouping.Select(bom => bom.QtyPer)) });
string[][] asStringArray = asEnumerable.ToArray();
于 2013-04-01T22:47:50.737 に答える
0
// For convenience add read-only property
public sealed class BOM
{
    ...
    public string PartAndQuantity { get{return Part + ", " + QtyPer;} }
}

// Group by FlatComponent and then use string.Join:
var result = list.GroupBy (l => l.FlatComponent).Select(
    g => new 
    {
        Flat=g.Key, 
        Parts=string.Join(", ", g.Select (x => x.PartAndQuantity))
    });

その結果、

Flat Parts 
a    "1, 2, 3, 4"
b    "5, 6"
c    "7, 8, 9, 0"

ただし、おそらく必要です

var result = list.GroupBy (l => l.FlatComponent).Select(
    g => new 
    {
        Flat=g.Key, 
        Parts=g.Select (x => x.PartAndQuantity).ToList()
    });
于 2013-04-01T22:50:52.737 に答える