2015-10-29 177 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的查詢嗎? –