从 List中删除重复项在 C# 中

发布于 2025-01-04 00:09:33 字数 2000 浏览 5 评论 0原文

我这里遇到的问题比几天前我试图解决的问题要复杂一些。我正在使用 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();

有帮助吗?谢谢

I have an issue here a bit complex than I'm trying to resolve since some days ago. I'm using the PetaPoco ORM and didn't found any other way to do a complex query like this:

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

I'm trying to get the user capabilities, but my system have actually to ways to assign an user a capability, or direct to that user or attaching the user to a role. I wanted to get this merged list using a stored procedure but I needed cursors and I thought maybe should be easier and faster doing this on the web application. So I get that two dynamics and the members capabilities have priority to the roles capabilities, so I need to check if that using loops. And I did like this:

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

So now the plan is delete the duplicate entries. I have try using the following methods with no results:

  data = data.Distinct();

Any help? Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

过气美图社 2025-01-11 00:09:33

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

Make sure that your object either implements System.IEquatable or overrides Object.Equals and Object.GetHashCode. In this case, it looks like you're storing the data as string[2], which won't give you the desired behavior. Create a custom object to hold the data, and do one of the 2 options listed above.

救星 2025-01-11 00:09:33

如果我正确理解你的问题,你想要得到一组不同的字符串数组,所以如果同一个数组存在两次,你只想要其中一个?以下代码将返回数组一和三,而数组二则被删除,因为它与数组一相同。

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

If I understand your question correctly you want to get a distinct set of arrays of strings, so if the same array exists twice, you only want one of them? The following code will return arrays one and three while two is removed as it is the same as one.

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();
痴骨ら 2025-01-11 00:09:33

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

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

You might have to use ToList() after Distinct():

List<string[]> distinct = data.Distinct().ToList();
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文