【问题标题】:Merge two list items based on single value in the list collection in c#c#中基于列表集合中的单个值合并两个列表项
【发布时间】:2018-03-15 09:36:42
【问题描述】:
     List<Person> persons = null;
                persons = new List<Person>();
                persons.Add(new Person
                {
                    Id = 1,
                    FirstName = "Chris",
                    LastName = "Cummings",
                    phn = 111223333,
                    comment="test"
                }); 
                persons.Add(new Person
                {
                    Id = 2,
                    FirstName = "Chris",
                    LastName = "Cummings",
                    phn = 987654321,
                    comment=""
                });
                persons.Add(new Person
                {
                    Id = 3,
                    FirstName = "John",
                    LastName = "Steinbeck",
                    phn = 111223333,
                    comment = "dfdf"
                }); 
persons.Add(new Person
            {
                Id = 4,
                FirstName = "fgg",
                LastName = "hgh",
                phn = 545,
                comment = ""
            }); 

从上面的列表中我想显示下面的数据

如果任何人的名字和姓氏匹配,则该人必须包含 cmets,否则删除没有 cmets 的其他人

    Id = 1,
                    FirstName = "Chris",
                    LastName = "Cummings",
                    phn = 111223333,
                    comment="test"
    Id = 3,
                    FirstName = "John",
                    LastName = "Steinbeck",
                    phn = 111223333,
                    comment = "dfdf"
Id = 4,
                    FirstName = "fgg",
                    LastName = "hgh",
                    phn = 545,
                    comment = ""

【问题讨论】:

  • 我只能看到 1 个列表
  • @Sujit.Warrier 这个问题确实说“合并两个列表项”而不是 2 个列表。

标签: c# asp.net linq c#-4.0


【解决方案1】:

您可以使用GroupBy 并在之后使用SelectMany 函数过滤结果

var result = 
    persons.GroupBy(p => new { p.FirstName, p.LastName })
           .SelectMany(g => g.Where(p => string.IsNullOrEmpty(p.Comment) == false));

如果您想保留没有匹配人员且评论为空的人员,您可以添加条件group.Count() == 1

var result = 
    persons.GroupBy(p => new { p.FirstName, p.LastName })
           .SelectMany(g => 
                      {
                          var isSingle = g.Count() == 1;
                          return g.Where(p => isSingle || !string.IsNullOrEmpty(p.Comment))
                      });

【讨论】:

  • 刚刚用新人的详细信息编辑了我的问题,在这种情况下,它不符合这个逻辑。 @法比奥
  • @User333,第二种方法将适用于您的新(编辑)要求。我期待着;)
  • 第二种方法是返回所有值@Fabio
  • @User333,不,第二种方法可行。我认为您的 GroupBy 代码有问题,因为在您的尝试中似乎 GroupBy 返回只有一个人的组
  • 你是对的!我误解了要求,我将删除我的答案。
【解决方案2】:
//Union the persons and use the comparer class

var result =   persons.Union(persons, new PersonComparer()).Where(e=> !string.IsNullOrEmpty( e.comment));
//Use the below comparer class

public class PersonComparer : IEqualityComparer<Person>
{

    public bool Equals(Person x, Person y)
    {
        return x.FirstName == y.FirstName && x.LastName == y.LastName;
    }

    public int GetHashCode(Person obj)
    {
        return obj.FirstName.GetHashCode() + obj.LastName.GetHashCode();
    }
}

【讨论】:

    猜你喜欢
    • 2011-12-20
    • 2021-06-26
    • 1970-01-01
    • 1970-01-01
    • 2014-08-30
    • 2021-03-04
    • 1970-01-01
    • 1970-01-01
    • 2020-03-26
    相关资源
    最近更新 更多