从C#</string []>中的List <string []>中删除重复项

时间:2012-02-09 00:26:13

标签: c# asp.net dynamic petapoco

我有一个问题,比我几天前试图解决的有点复杂。我正在使用PetaPoco ORM并且没有找到任何其他方法来执行这样的复杂查询:

   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();

有任何帮助吗?感谢

3 个答案:

答案 0 :(得分:2)

确保您的对象实现System.IEquatable或覆盖Object.Equals和Object.GetHashCode。在这种情况下,看起来您将数据存储为字符串[2],这将无法提供所需的行为。创建一个自定义对象来保存数据,并执行上面列出的两个选项之一。

答案 1 :(得分:1)

您可能必须在Distinct()之后使用ToList():

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

答案 2 :(得分: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();