【问题标题】:Custom arrays compare or find value which is not exist in another array with linq自定义数组使用 linq 比较或查找另一个数组中不存在的值
【发布时间】:2015-09-09 11:02:21
【问题描述】:

我有两个自定义类,

  1. BeneficiaryResponse
  2. BeneficiaryDetail

两者都有 key IdAliasName 字段。

我想在 Linq 查询的帮助下从第一类中获取那些缺失值,即 BeneficiaryResponse,它在 Beneficiary Detail 中不存在。 例如。 BeneficiaryResponse 有 30 个参数,而 Beneficiary 有 20 个参数,那么我希望 BeneficiaryResponse 中缺少 10 个参数。

public class BeneficiaryDetail
{
     public BeneficiaryDetail[] beneInternal
     {
        get;
        set;
     }

     public int? Id
     {
        get;
        set;
     }

     public string AliasName
     {
        get;
        set;
     }
}

public class BeneficiaryResponse
{
    public int Id
    {
        get;
        set;
    }

    public string AliasName
    {
        get;
        set;
    }
}

现在 BeneficiaryResponse 有以下内容,

[{"Id":763886,"AliasName":"ABC-3594"},
{"Id":763759,"AliasName":"ABC-6789"},
{"Id":763661,"AliasName":"ABC-9111"},
{"Id":763668,"AliasName":"ABC-9111"},
{"Id":764467,"AliasName":"ABC-3594"}]

和 BeneficiaryDetail 有,

[{"Id":763886,"AliasName":"ABC-3594"},
{"Id":763759,"AliasName":"ABC-6789"},
{"Id":764467,"AliasName":"ABC-3594"}]

如何从 BeneficiaryResponse 中获取剩下的 2 个缺失。

【问题讨论】:

  • 所以是LinQReflection 的问题?您想检测第二个列表中不存在一个对象的位置吗? (在 Linq 中搜索 Google 以查找 Contains)或者您想通过 Reflection 从对象中提取一些 FieldsMethodInfo
  • 我尝试过使用“Except”和“Sequence”,但它不起作用。我只是想要所有那些在另一个中不存在的字段的值,比如两个数组 A 和 B。A 有 10 个值,而 B 有 8 个。然后我想要那些 2。
  • 我同意@Jasper,这还不清楚。这个问题至少需要一些样本数据和预期的结果。您对“字段”和“参数”这两个词的使用令人困惑。
  • Linq 的答案:collection1.Where(item => collection2.Contains(item)).Select(item => item)

标签: c# arrays linq


【解决方案1】:

添加 Newtonsoft.Josn dll

    public void Main(string[] args)
    {
        string strBR = "[{ 'Id':763886,'AliasName':'ABC-3594'},{ 'Id':763759,'AliasName':'ABC-6789'},{ 'Id':763661,'AliasName':'ABC-9111'},{ 'Id':763668,'AliasName':'ABC-9111'},{ 'Id':764467,'AliasName':'ABC-3594'}]";
        string strBD = " [{'Id':763886,'AliasName':'ABC-3594'},{'Id':763759,'AliasName':'ABC-6789'},{'Id':764467,'AliasName':'ABC-3594'}]";

        var resultBR = JsonConvert.DeserializeObject<List<BeneficiaryResponse>>(strBR);
        var resultBD = JsonConvert.DeserializeObject<List<BeneficiaryDetail>>(strBD);

        var missingData = resultBR.Where(x => !resultBD.Select(n => n.Id).Contains(x.Id)).ToList();

        foreach (var item in missingData)
        {
            Console.WriteLine(item.Id);
        }

    }
    public class BeneficiaryResponse
    {
        public int Id { get; set; }
        public string AliasName { get; set; }

    }
    public class BeneficiaryDetail
    {
        public int Id { get; set; }
        public string AliasName { get; set; }
    }

输出:763661 763668

【讨论】:

  • 它的工作。感谢你。根据需要修改了我的代码及其工作。
【解决方案2】:

您可以使用以下 linq 代码进行输出。 它将根据 ID 参数给出输出。 可能对你有帮助。

var result= (from c in BeneficiaryResponse 
             where !(from o in BeneficiaryDetail select o.ID).Contains(c.ID)  
             select c);

var result= from BResponse in BeneficiaryResponse 
            where !(BeneficiaryDetail.Any
                   (BDetail => BDetail.ID == Response.ID 
                    && BDetail.AliasName == BResponse.AliasName))
            select BResponse;

【讨论】:

    猜你喜欢
    • 2019-02-28
    • 2019-09-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-23
    • 1970-01-01
    • 1970-01-01
    • 2019-02-14
    • 2020-11-03
    相关资源
    最近更新 更多