比较两个foreach循环中的两个值

时间:2011-10-08 03:08:35

标签: c#

我有一个Foreach循环,每次迭代都会将记录放入系统中。然后我还有一个foreach循环,它从linqQuery获取数据。我想迭代每一个并比较每个的FullName,如果它的真实,它使bool为true,如果不是,则将其标记为false。我该怎么做呢这是我到目前为止所做的。

    foreach (Lead p in sessionleads)
    {

        string AccountName = "";
        string AccountId = "";
        string ContactId = "";
        bool b = false;
        foreach (var a in linqQuery)
        {
            AccountName = a.AccountName.ToString();
            AccountId = a.AccountId.ToString();
            ContactId = a.ContactId.ToString();

            if (AccountName.ToString() == p.AccountName.ToString())
            {
                b = true;
            }
            else
            {
                b = false;
            }
        }


        if (b == true)
        {
            Entity opportunity = new Entity("opportunity");
            opportunity["new_contact"] = new EntityReference("contact", new Guid(ContactId));
            opportunity["customerid"] = new EntityReference("account", new Guid(AccountId));
            opportunity.FormattedValues["new_leadstatus"] = p.Status;
            opportunity.FormattedValues["statuscode"] = p.Type;

            //opportunity["ownerid"] = 
            Guid opportunityId = orgService.Create(opportunity);

        }
        else
        {
            Entity opportunity = new Entity("opportunity");
            opportunity["new_contact"] = new EntityReference("contact", contactId);
            opportunity["customerid"] = new EntityReference("account", accountId);
            opportunity.FormattedValues["new_leadstatus"] = p.Status;
            opportunity.FormattedValues["statuscode"] = p.Type;

            //opportunity["ownerid"] = 
            Guid opportunityId = orgService.Create(opportunity);
        }

    }

谢谢!

2 个答案:

答案 0 :(得分:2)

第一次检查后添加休息时间:

if (AccountName.ToString() == p.AccountName.ToString())
{
    b = true;
    break;
    ...

更好:

var item = (from i in linqQuery 
            where i.AccountName == p.AccountName 
            select i).FirstOrDefault();
bool found = (item != null);
if(found)
{
   ....
}
else
{
   ....
}

然后,用它来进行其余的逻辑检查。

答案 1 :(得分:1)

简短的回答 - @Ingenu是对的。您只是错过了break个关键字。但是,您可能需要考虑其他一些重构来稍微收紧代码。

这是第一次通过,保持大致相同的结构。免责声明:这是用记事本编码的 - 不保证甚至编译......

foreach (var p in sessionLeads)
{
    Guid AccountId = accountId;
    Guid ContactId = contractId;

    foreach (var a in linqQuery)
    {           
        if (a.AccountName == p.AccountName)
        {
            AccountId = new Guid(a.AccountId);
            ContactId = new Guid(a.ContactId);
            break;
        }
    }

    Entity opportunity = new Entity("opportunity");
    opportunity["new_contact"] = new EntityReference("contact", ContactId);
    opportunity["customerid"] = new EntityReference("account", AccountId);
    opportunity.FormattedValues["new_leadstatus"] = p.Status;
    opportunity.FormattedValues["statuscode"] = p.Type;
    orgService.Create(opportunity);
}

第一次通过的几个关键点......

    从未指定
  • contractIdaccountId(以小写字母开头)。我认为他们是guids。
  • 如果您要立即重置变量,请不要无法初始化变量。就像使用AccountNameAccountId
  • 一样
  • 不需要AccountName变量。
  • 我保留了AccountNameContactId变量名称,但大多数人都使用小写字母启动局部变量。
  • 回到原来的问题。找到匹配后缺少break退出循环。
  • DRY (不要重复自己) - 大多数opportunity代码都与b == trueb == false重复。尽量不这样做,这会使维护变得困难。很多时候,可以通过将代码位提取到一个小的,集中的方法(如CreateOpportunity(...))来修复重复。不要害怕使方法变小。

通过第二名。同样的免责声明......

foreach (var p in sessionLeads)
{
    var match = linqQuery.FirstOrDefault(x => x.AccountName == p.AccountName);
    Guid AccountId = (match != null ? new Guid(match.AccountId) : accountId);
    Guid ContactId = (match != null ? new Guid(match.ContractId) : contractId);

    Entity opportunity = new Entity("opportunity");
    opportunity["new_contact"] = new EntityReference("contact", ContactId);
    opportunity["customerid"] = new EntityReference("account", AccountId);
    opportunity.FormattedValues["new_leadstatus"] = p.Status;
    opportunity.FormattedValues["statuscode"] = p.Type;
    orgService.Create(opportunity);
}
  • 使用Linq扩展方法摆脱内部for循环。 Linq扩展方法 - 学习它们,爱它们,它们是你最好的朋友。

Linq Join可能会更进一步,但我认为此时此刻非常紧张。我和我需要睡觉。希望这对你有用!