2015-10-29 280 views
0

我管理一个呼叫中心。我正在尝试将未应答的呼叫添加到池中。比较两个列表

我有两个列表,我从一个表中获取这些列表,因为我的一些属性为空,而其中一些不为空。

空值表示业务代表没有选择,非空值表示业务代表接收到呼叫,或者稍后调用错过的客户端。

容易的部分是从表中获取空值并将它们添加到池中。最难的部分是找出代理是否在将未接来电添加到游泳池之前回叫。

请参阅下面的示例。在示例中,我想从“abc”列表中删除def列表中AgentAnswerTime不为空的项目。

List<UnansweredCallList> abc = 
    { PhoneNumber = "123123", AgentAnswerTime = "null", CallTime = "12:30:59" }, 
    { PhoneNumber = "321321", AgentAnswerTime = "null", CallTime = "12:54:50" } 

List<AnsweredCallsList> def = 
    { PhoneNumber = "123123", AgentAnswerTime = "10272015 12:31:00", CallTime = "12:30:59" }, 
    { PhoneNumber = "321321", AgentAnswerTime = "null", CallTime = "12:54:50" } 

我想要这个结果。

List<UnansweredCallList> abc = 
    { PhoneNumber = "321321", AgentAnswerTime = "null", CallTime = "12:54:50" } 

我试过linq Except

实际代码:

var query = (
    from c in db.calls 
    where c.PhoneNO.Length >= 9 && c.AGENT_Answer_Time == null && c.ClientNO != null && c.Call_Time > start_date && c.Call_Time < end_date 
    select new 
     { 
      c.PhoneNO, 
      c.Call_Time, 
      c.AGENT_Answer_Time, 
      c.ClientNO, 
      c.ROBOP 
     }).ToList(); 

var query = (
    from c in db.calls 
    where c.PhoneNO.Length >= 9 && c.AGENT_Answer_Time != null && c.ClientNO != null && c.Call_Time > start_date && c.Call_Time < end_date 
    select new 
     { 
      c.PhoneNO, 
      c.Call_Time, 
      c.AGENT_Answer_Time, 
      c.ClientNO, 
      c.ROBOP 
     }).ToList(); 
+0

显示代码你试过了。 Linq除了是要走的路,你需要一个自定义的比较器 – pm100

+0

当两个列表来自一个表时,这意味着只有来自该表的一个查询就可以得到结果。 –

+0

可以举例请Martin Staufcik –

回答

0

会是这样的工作?

void Main() 
{ 
    List<Call> unanswered = new List<Call>() 
    { 
     new Call() { PhoneNumber = "123123", AgentAnswerTime = "null", CallTime = "12:30:59" }, 
     new Call() { PhoneNumber = "321321", AgentAnswerTime = "null", CallTime = "12:54:50" } 
    }; 

    List<Call> answered = new List<Call>() 
    { 
     new Call() { PhoneNumber = "123123", AgentAnswerTime = "10272015 12:31:00", CallTime = "12:30:59" }, 
     new Call() { PhoneNumber = "321321", AgentAnswerTime = "null", CallTime = "12:54:50" } 
    }; 

    var result = unanswered.Where(call => 
    { 
     var answeredCall = answered.FirstOrDefault(c => c.PhoneNumber == call.PhoneNumber); 

     return answeredCall != null && answeredCall.AgentAnswerTime == "null"; 
    }); 

    foreach(var r in result) 
    { 
     Console.WriteLine(r.PhoneNumber); 
    } 
} 

public class Call 
{ 
    public string PhoneNumber { get; set; } 
    public string AgentAnswerTime { get; set; } 
    public string CallTime { get; set; } 
} 
+0

总是返回null。 –

+0

如果检查我的示例数据,你可以看到def上有一个null和not null值。在abc上有一个等于def“123123”的数字,def时间不为空。我只是想比较这样。并返回“321321”。但是你的代码总是返回null。 –

+0

对不起,这是因为'AgentAnswerTime'设置为字符串“null”而不是null值。我已经更新了答案。 – RagtimeWilly

0

我相信你可以使用Except并传递一个自定义的IEqualityComparer它,你可以实现你的比较情况。这将从第一个列表中删除第二个实例,因为第二个实例中存在语义相同的对象。

2
from a in abc 
join d in def on a.PhoneNumber equals d.PhoneNumber 
where d.AgentAnswerTime == "null" 
select a 
1

定义你的类,以便AnsweredCallsList延长UnansweredCallList

public class UnansweredCallList 
{ 
    public string PhoneNumber; 
    public string AgentAnswerTime; 
    public string CallTime; 
} 

public class AnsweredCallsList : UnansweredCallList 
{ 
} 

实现以下相等比较

public class CallListComparer : IEqualityComparer<UnansweredCallList> 
    { 
     public bool Equals(UnansweredCallList x, UnansweredCallList y) 
     { 
      return x.PhoneNumber == y.PhoneNumber && y.AgentAnswerTime != "null" || x.AgentAnswerTime != "null"; 
     } 

     public int GetHashCode(UnansweredCallList obj) 
     { 
      return obj.PhoneNumber.GetHashCode(); 
     } 
    } 

然后,使用LINQ.Except:

List<UnansweredCallList> abc = new List<UnansweredCallList>(new UnansweredCallList[] 
    { 
     new UnansweredCallList() {PhoneNumber="123123" , AgentAnswerTime="null", CallTime="12:30:59"}, 
     new UnansweredCallList() {PhoneNumber="321321" , AgentAnswerTime="null" , CallTime="12:54:50"} 
    }); 

    List<AnsweredCallsList> def = new List<AnsweredCallsList>(new AnsweredCallsList[] 
    { 
     new AnsweredCallsList() {PhoneNumber="123123" , AgentAnswerTime="10272015 12:31:00", CallTime="12:30:59"}, 
     new AnsweredCallsList() {PhoneNumber="321321" , AgentAnswerTime="null" , CallTime="12:54:50"} 
    }); 

    IEnumerable<UnansweredCallList> result = abc.Except<UnansweredCallList>(def, new CallListComparer()); 

    Console.WriteLine(result.Count<UnansweredCallList>()); 
+0

我没有得到这个工作。 –

+0

你试过AD.Net的查询吗? –