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 或任何方法将连接记录 1 和 2 作为字典中的 1 记录?它将删除重复或加入的记录

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

具有这两个地址的公司将保留,关键是自动递增编号,这使得每一行都是唯一的。

我想使用的比较器是 CompanyNumber 和 CompanyName,因为我发现这 2 值不会为空。这也是识别它们相同的唯一方法。

4

1 回答 1

5

这应该可以使用GroupBy,Aggregatenull 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为每组CompanyName/构造一个新的CompanyNumber

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 回答