2012-02-09 106 views
0

我在這裏有一個問題比我前幾天想解決的有點複雜。我使用的是PetaPoco ORM,並沒有發現任何其他方式做這樣一個複雜的查詢:刪除C#中的列表<String[]>中的重複項目

var data = new List<string[]>(); 
    var db = new Database(connectionString); 
    var memberCapabilities = db.Fetch<dynamic>(Sql.Builder 
     .Select(@"c.column_name 
      ,CASE WHEN c.is_only_view = 1 
       THEN c.is_only_view 
       ELSE mc.is_only_view end as is_only_view") 
     .From("capabilities c") 
     .Append("JOIN members_capabilities mc ON c.capability_id = mc.capability_id") 
     .Where("mc.member_id = @0", memberID) 
     .Where("c.table_id = @0", tableID)); 

    var roleCapabilities = db.Fetch<dynamic>(Sql.Builder 
     .Select(@"c.column_name 
      ,CASE WHEN c.is_only_view = 1 
       THEN c.is_only_view 
       ELSE rc.is_only_view end as is_only_view") 
     .From("capabilities c") 
     .Append("JOIN roles_capabilities rc ON c.capability_id = rc.capability_id") 
     .Append("JOIN members_roles mr ON rc.role_id = mr.role_id") 
     .Where("mr.member_id = @0", memberID) 
     .Where("c.table_id = @0", tableID)); 

我試圖獲取用戶的能力,但我的系統實際上得的方式來分配用戶的能力,或者直接指向該用戶或將用戶附加到角色。我想使用存儲過程得到這個合併列表,但我需要遊標,我想也許應該更容易,更快速地在Web應用程序上執行此操作。所以我得到了這兩種動態和成員能力對角色能力的優先權,所以我需要檢查是否使用循環。我的確如此:

for (int i = 0; i < roleCapabilities.Count; i++) 
    { 
     bool added = false; 
     for (int j = 0; j < memberCapabilities.Count; j++) 
      if (roleCapabilities[i].column_name == memberCapabilities[j].column_name) 
      { 
       data.Add(new string[2] { memberCapabilities[j].column_name, Convert.ToString(memberCapabilities[j].is_only_view) }); 
       added = true; 
       break; 
      } 
     if (!added) 
      data.Add(new string[2] { roleCapabilities[i].column_name, Convert.ToString(roleCapabilities[i].is_only_view) }); 
     } 

所以現在計劃刪除重複的條目。我嘗試使用以下方法,但沒有結果:

data = data.Distinct(); 

任何幫助?後鮮明的()謝謝

回答

1

如果我正確理解你的問題,你想得到一組不同的字符串數組,所以如果同一個數組存在兩次,你只需要其中之一?下面的代碼將返回數組一和三,而兩個被刪除,因爲它是一樣的。

var one = new[] {"One", "Two"}; 
var two = new[] {"One", "Two"}; 
var three = new[] {"One", "Three"}; 

List<string[]> list = new List<string[]>(){one, two, three}; 


var i = list.Select(l => new {Key = String.Join("|", l), Values = l}) 
    .GroupBy(l => l.Key) 
    .Select(l => l.First().Values) 
    .ToArray(); 
+0

完美!這對我的情況感謝:) – vcliment89 2012-02-09 00:57:16

1

您可能必須使用ToList():

List<string[]> distinct = data.Distinct().ToList(); 
+0

我已經嘗試過,但仍然有重複。可以在此功能後查看調試屏幕截圖。 [鏈接](http://img812.imageshack.us/img812/5988/sinttulobl.jpg) – vcliment89 2012-02-09 00:38:52

2

確保你的對象要麼實現System.IEquatable或重寫Object.Equals和Object.GetHashCode。在這種情況下,它看起來像是將數據存儲爲字符串[2],這不會給你想要的行爲。創建一個自定義對象來保存數據,並執行上面列出的兩個選項之一。