3

私はDictionary<int, List<someclass>> = new Dictionary<int, List<someClass>>();

クラスはこのようなものにすることができます

public class someclass
{ 
    public string CompanyName { get; set; }
    public string address { get; set; }
    public string Alternativeaddress { get; set; }
    public string CompanyNumber { get; set; }
}

例えば

ディクショナリ内のリストには、以下の 2 行が含まれます。

Output
CompanyName           address            Alternativeaddress      CompanyNumber
AAAA                  11 Mainden Street  NULL                    3243-A
AAAA                  NULL               12 Maiden Street        3243-A

とにかく、LINQ または任意の方法を使用して、Join レコード 1 と 2 を辞書の 1 つのレコードとして作成しますか? 重複または結合されたレコードを削除します

Output
CompanyName           address            Alternativeaddress      CompanyNumber
AAAA                  11 Mainden Street  12 Maiden Street        3243-A

両方のアドレスを持つ会社は残ります。キーは、すべての行を一意にする自動インクリメント番号です。

この 2 つの値が null ではないことがわかったため、使用したい Comparer は CompanyNumber と CompanyName になります。また、それらが同じであることを識別する唯一の方法です。

4

1 に答える 1

5

GroupByこれは、Aggregateとを使用して可能になるはずnull coalesce operatorです。


someclass便宜上、あなたにアクターを追加しました:

public class someclass
{ 
    public string CompanyName { get; set; }
    public string address { get; set; }
    public string Alternativeaddress { get; set; }
    public string CompanyNumber { get; set; }
    public someclass(string name, string address, string address2, string number)
    {
        this.CompanyName=name;
        this.address=address;
        this.Alternativeaddress=address2;
        this.CompanyNumber=number;
    }
}

したがって、次のsomeclassように のリストが与えられます。

var a = new someclass("AAAA", "11 Mainden Street", null, "3243-A");
var b = new someclass("AAAA", null, "11 Mainden Street", "3243-A");

var c = new someclass("BBBB", null, null, "hooray");
var d = new someclass("BBBB", "something", null, "hooray");
var e = new someclass("BBBB", null, "foobar", "hooray");

var list = new List<someclass>() {a, b, c, d, e};

次のような方法を使用できます。

public IEnumerable<someclass> MergeList(IEnumerable<someclass> list)
{
    // use 'GroupBy' for grouping, obv.
    foreach(var g in list.GroupBy(l => Tuple.Create(l.CompanyName, l.CompanyNumber)))
    {
        // use 'Select', 'Aggregate' and '??' to find the first non-empty string for each property
        var adress = g.Select(x => x.address).Aggregate((x, y) => x ?? y);
        var alternative = g.Select(x => x.Alternativeaddress).Aggregate((x, y) => x ?? y);
        // return a new 'someclass'
        yield return new someclass(g.Key.Item1, adress, alternative, g.Key.Item2);  
    }
}

/someclassの各グループに対して新しいを構築するには:CompanyNameCompanyNumber

var merged = MergeList(list);

結果:

 CompanyName | address            | Alternativeaddress | CompanyNumber   
-------------+--------------------+--------------------|----------------  
 AAAA        | 11 Mainden Street  | 11 Mainden Street  | 3243-A   
 BBBB        | something          | foobar             | hooray 

これにより、元のインプレースを変更するのではなく、新しいコレクションが作成されることに注意してください。ただしList、アイデアは得られます。

于 2013-01-02T14:53:07.670 に答える