Удалить дубликаты элементов из списка <String []> в C # - PullRequest
0 голосов
/ 09 февраля 2012

У меня проблема здесь немного сложнее, чем я пытаюсь решить несколько дней назад. Я использую 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));

Я пытаюсь получить пользовательские возможности, но моя система на самом деле имеет способы назначить пользователю возможность, или направить этому пользователю или присоединить пользователя к роли. Я хотел получить этот объединенный список, используя хранимую процедуру, но мне нужны были курсоры, и я подумал, что, возможно, должно быть проще и быстрее сделать это в веб-приложении. Итак, я понимаю, что две динамики и возможности членов имеют приоритет над возможностями ролей, поэтому мне нужно проверить, используют ли они циклы. И я сделал это так:

   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 ]

2 голосов
/ 09 февраля 2012

Убедитесь, что ваш объект либо реализует System.IEquatable, либо переопределяет Object.Equals и Object.GetHashCode. В этом случае похоже, что вы храните данные в виде строки [2], что не даст вам желаемого поведения. Создайте пользовательский объект для хранения данных и выполните одну из 2 опций, перечисленных выше.

1 голос
/ 09 февраля 2012

Если я правильно понимаю ваш вопрос, вы хотите получить отдельный набор массивов строк, поэтому, если один и тот же массив существует дважды, вам нужен только один из них?Следующий код возвратит массивы один и три, а два удаляется, так как он совпадает с единицей.

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();
1 голос
/ 09 февраля 2012

Возможно, вам придется использовать ToList () после Distinct ():

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