查找列表中与列表的第一项相比的不同项

时间:2014-08-01 16:02:12

标签: c# linq

我有一个GroupSummary class,其中包含以下属性:

public class GroupsSummary
{
    public bool UsedRow { get; set; }

    public string GroupTin   { get; set; }
    public string PayToZip_4 { get; set; }
    public string PayToName  { get; set; }

    public string PayToStr1     { get; set; }
    public string PayToStr2     { get; set; }
    public string PayToCity     { get; set; }
    public string PayToState    { get; set; }
    public bool   UrgentCare_YN { get; set; }
}

然后我有Dictionary <string, List<GroupSummary>

对于这些字典项中的每一项,我首先得到其列表中FIRST项的值,我感兴趣的是:

PayToStr1,PayToStr2,PayToCity,PayToState

现在对于该键列表中的其余项目(所以从第二项开始)我想找到所有组合(只是字符串连接正常) 他们的PayToStr1,PayToStr2,PayToCity,PayToState与我上面提到的第一项不同。

写这个的好方法是什么?我可以做for-each loop并解决它,但我希望有更好的LINQ方法来做到这一点。

3 个答案:

答案 0 :(得分:2)

List<GroupsSummary> items = new List<GroupsSummary>();

var first = items.First();
var others = from i in items.Skip(1)
             where i.PayToStr1 != first.PayToStr1 ||
                   i.PayToStr2 != first.PayToStr2 ||
                   ....
             select i;

或者你可以在GroupsSummary中定义一个方法,并在where子句中使用它:

public bool IsDifferentFrom(GroupsSummary other)
{
    return PayToStr1 != other.PayToStr1 ||
           PayToStr2 != other.PayToStr2 ||
           ....;
}

var others = from i in items.Skip(1)
             where i.IsDifferentFrom(first)
             select i;

答案 1 :(得分:1)

您可以尝试这样的事情:

List<GroupSummary> result = dictionary[key].Skip(1)
                                           .Where(x=>(x.PayToStr1+
                                                      x.PayToStr2+
                                                      x.PayToCity+
                                                      x.PayToState)!=
                                                      (dictionary[key][0].PayToStr1+
                                                       dictionary[key][0].PayToStr2+
                                                       dictionary[key][0].PayToCity+
                                                       dictionary[key][0].PayToState))
                                           .ToList();     

答案 2 :(得分:1)

您的问题:

  

查找列表中与列表中第一项不同的项目。

这是一个简单的整数列表的解决方案:

var items = new List<int> {1, 2, 3, 1, 7, 4, 6, 1, 9};

var query = items
    .Skip(1)
    .Distinct()
    .Where(x => x != items.First())
    .OrderBy(x => x);

foreach (int item in query)
{
    Console.WriteLine(item);
}

预期输出:

2
3
4
6
7
9

可以轻松扩展此查询以使用GroupsSummary类。只需定义一个实例方法(如果你不拥有GroupsSummary类,则定义一个扩展方法)来检查&#34;等价&#34;两个GroupsSummary个对象:

public bool IsEquivalentTo(GroupsSummary other)
{
    return
        this.PayToStr1.Equals(other.PayToStr1) &&
        this.PayToStr2.Equals(other.PayToStr2) &&
        this.PayToCity.Equals(other.PayToCity) &&
        this.PayToState.Equals(other.PayToState);
}

上面LINQ查询中的Where约束变为:

.Where(x => !x.IsEquivalentTo(items.First())