В то время как Loop занимает больше времени, чтобы обработать выполнение чтения [duplicate]

Статические поля и методы связаны с самим классом, а не с его экземплярами. Если у вас есть класс A, «нормальный» метод b и статический метод c, и вы создаете экземпляр a вашего класса A, вызовы A.c() и a.b() действительны. Метод c() не знает, какой экземпляр подключен, поэтому он не может использовать нестатические поля.

Решение для вас состоит в том, что вы либо статируете свои поля, либо ваши методы не статичны. Вы могли бы выглядеть так:

class Programm {
  public static void main(String[] args){
    Programm programm = new Programm();
    programm.start();
  }
  public void start(){
    // can now access non-static fields
  }
}
121
задан balint 15 June 2009 в 20:57
поделиться

7 ответов

Вы пытаетесь отличаться более чем одним полем? Если это так, просто используйте анонимный тип и оператор Distinct, и все должно быть в порядке:

var query = doc.Elements("whatever")
               .Select(element => new {
                             id = (int) element.Attribute("id"),
                             category = (int) element.Attribute("cat") })
               .Distinct();

Если вы пытаетесь получить отличный набор значений «большего» типа, но только смотрите в некоторых подмножествах свойств для аспекта отличимости вы, вероятно, захотите DistinctBy, как реализовано в MoreLINQ в DistinctBy.cs :

 public static IEnumerable<TSource> DistinctBy<TSource, TKey>(
     this IEnumerable<TSource> source,
     Func<TSource, TKey> keySelector,
     IEqualityComparer<TKey> comparer)
 {
     HashSet<TKey> knownKeys = new HashSet<TKey>(comparer);
     foreach (TSource element in source)
     {
         if (knownKeys.Add(keySelector(element)))
         {
             yield return element;
         }
     }
 }

( Если вы перейдете в null в качестве компаратора, он будет использовать сопоставитель по умолчанию для типа ключа.)

195
ответ дан feelingsofwhite 28 August 2018 в 04:41
поделиться
  • 1
    Таким образом, под "более крупным типом" вы можете иметь в виду, что мне все еще нужны все свойства в результате, хотя я хочу сравнить только несколько свойств, чтобы определить отличимость? – The Red Pea 20 September 2016 в 14:31
  • 2
    @TheRedPea: Да, точно. – Jon Skeet 20 September 2016 в 14:46

Поскольку мы говорим о том, что каждый элемент ровно один раз, «набор» имеет больше смысла для меня.

Пример с классами и IEqualityComparer реализован:

 public class Product
    {
        public int Id { get; set; }
        public string Name { get; set; }

        public Product(int x, string y)
        {
            Id = x;
            Name = y;
        }
    }

    public class ProductCompare : IEqualityComparer<Product>
    {
        public bool Equals(Product x, Product y)
        {  //Check whether the compared objects reference the same data.
            if (Object.ReferenceEquals(x, y)) return true;

            //Check whether any of the compared objects is null.
            if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null))
                return false;

            //Check whether the products' properties are equal.
            return x.Id == y.Id && x.Name == y.Name;
        }
        public int GetHashCode(Product product)
        {
            //Check whether the object is null
            if (Object.ReferenceEquals(product, null)) return 0;

            //Get hash code for the Name field if it is not null.
            int hashProductName = product.Name == null ? 0 : product.Name.GetHashCode();

            //Get hash code for the Code field.
            int hashProductCode = product.Id.GetHashCode();

            //Calculate the hash code for the product.
            return hashProductName ^ hashProductCode;
        }
    }

Теперь

List<Product> originalList = new List<Product> {new Product(1, "ad"), new Product(1, "ad")};
var setList = new HashSet<Product>(originalList, new ProductCompare()).ToList();

setList будет иметь уникальные элементы

Я думал об этом, имея дело с .Except(), который возвращает разность значений

0
ответ дан Aditya A V S 28 August 2018 в 04:41
поделиться

В дополнение к ответу Джона Скита вы также можете использовать группу по выражениям для получения уникальных групп по w / count для каждой итерации групп:

var query = from e in doc.Elements("whatever")
            group e by new { id = e.Key, val = e.Value } into g
            select new { id = g.Key.id, val = g.Key.val, count = g.Count() };
23
ответ дан James Alexander 28 August 2018 в 04:41
поделиться

Я немного опоздал на ответ, но вы можете сделать это, если хотите, чтобы весь элемент, а не только значения, которые вы хотите сгруппировать:

var query = doc.Elements("whatever")
               .GroupBy(element => new {
                             id = (int) element.Attribute("id"),
                             category = (int) element.Attribute("cat") })
               .Select(e => e.First());

Это даст вы первый элемент, соответствующий вашей группе по выбору, так же, как второй пример Jon Skeets с использованием DistinctBy, но без реализации сравнения IEqualityComparer. DistinctBy, скорее всего, будет быстрее, но в приведенном выше решении будет меньше кода, если производительность не является проблемой.

8
ответ дан Olle Johansson 28 August 2018 в 04:41
поделиться
// First Get DataTable as dt
// DataRowComparer Compare columns numbers in each row & data in each row

IEnumerable<DataRow> Distinct = dt.AsEnumerable().Distinct(DataRowComparer.Default);

foreach (DataRow row in Distinct)
{
    Console.WriteLine("{0,-15} {1,-15}",
        row.Field<int>(0),
        row.Field<string>(1)); 
}
3
ответ дан Omar Ali 28 August 2018 в 04:41
поделиться

Для любого, кто все еще смотрит; вот еще один способ реализации пользовательского лямбда-компаратора.

public class LambdaComparer<T> : IEqualityComparer<T>
    {
        private readonly Func<T, T, bool> _expression;

        public LambdaComparer(Func<T, T, bool> lambda)
        {
            _expression = lambda;
        }

        public bool Equals(T x, T y)
        {
            return _expression(x, y);
        }

        public int GetHashCode(T obj)
        {
            /*
             If you just return 0 for the hash the Equals comparer will kick in. 
             The underlying evaluation checks the hash and then short circuits the evaluation if it is false.
             Otherwise, it checks the Equals. If you force the hash to be true (by assuming 0 for both objects), 
             you will always fall through to the Equals check which is what we are always going for.
            */
            return 0;
        }
    }

вы можете затем создать расширение для linq Distinct, которое может принимать в lambda's

   public static IEnumerable<T> Distinct<T>(this IEnumerable<T> list,  Func<T, T, bool> lambda)
        {
            return list.Distinct(new LambdaComparer<T>(lambda));
        }  

Использование:

var availableItems = list.Distinct((p, p1) => p.Id== p1.Id);
12
ответ дан Ricky G 28 August 2018 в 04:41
поделиться
  • 1
    Изучая исходный источник, Distinct использует хеш-набор для хранения элементов, которые он уже дал. Всегда возвращающий один и тот же хэш-код означает, что каждый ранее возвращенный элемент проверяется каждый раз. Более надежный хеш-код ускорит работу, потому что он будет сравнивать только элементы в одном и том же хэш-ведре. Zero является разумным дефолтом, но, возможно, стоит поддержать вторую лямбду для хэш-кода. – Darryl 1 July 2017 в 02:50
  • 2
    Хорошая точка зрения! Я попробую отредактировать, когда я получу время, если вы сейчас работаете в этом домене, не стесняйтесь редактировать – Ricky G 1 July 2017 в 03:44

Просто используйте Distinct() со своим собственным компаратором.

http://msdn.microsoft.com/en-us/library/bb338049.aspx

30
ответ дан Stu 28 August 2018 в 04:41
поделиться
  • 1
    Я написал свой пользовательский компаратор, и он отлично работает, спасибо! – balint 15 June 2009 в 21:39
Другие вопросы по тегам:

Похожие вопросы: