Использование .Select и .Where в одном операторе LINQ

Вы можете использовать редактор vi. Тип:

vi -o mysql.dump mytable.dump

, чтобы открыть как полный дамп mysql.dump, так и новый файл mytable.dump. Найдите соответствующую вставку в строку, нажав /, а затем введите фразу, например: «вставить в« mytable », а затем скопируйте эту строку с помощью yy. Перейдите к следующему файлу с помощью ctrl+w, затем down arrow key, вставьте скопированную строку с помощью pp. Наконец, сохраните новый файл, набрав :wq и довольно редактор vi с помощью :q.

Обратите внимание, что если вы сбросили данные с помощью нескольких вставок, вы можете скопировать (yank) все их сразу, используя Nyy, в котором N - количество строк, которые нужно скопировать.

Я сделал это с файлом размером 920 МБ.

23
задан Uwe Keim 3 June 2018 в 07:41
поделиться

3 ответа

Чтобы Enumerable.Distinct работали для вашего типа, вы можете реализовать IEquatable<T> и предоставить подходящие определения для Equals и GetHashCode, в противном случае он будет использовать реализацию по умолчанию: сравнение для равенство ссылок (при условии, что вы используете ссылочный тип).

Из руководства:

Метод Distinct (IEnumerable) возвращает неупорядоченную последовательность, которая не содержит повторяющихся значений. Он использует компаратор равенства по умолчанию, Default, для сравнения значений.

Средство сравнения по умолчанию, Default, используется для сравнения значений типов, которые реализуют универсальный интерфейс IEquatable. Чтобы сравнить пользовательский тип данных, вам необходимо реализовать этот интерфейс и предоставить собственные методы GetHashCode и Equals для этого типа.

В вашем случае, похоже, вам просто нужно сравнить идентификаторы, но вы также можете сравнить другие поля в зависимости от того, что для вас означает, что два объекта «одинаковы».

Вы также можете рассмотреть возможность использования DistinctBy из morelinq .

Обратите внимание, что это только LINQ to Objects, но я предполагаю, что это то, что вы используете.

Еще один вариант - объединить GroupBy и First:

 var query = // your query here...
    .GroupBy(x => x.Id)
    .Select(g => g.First());

Это также будет работать, например, в LINQ to SQL.

11
ответ дан Mark Byers 3 June 2018 в 07:41
поделиться

Вы добавили Select() после Where() или раньше?

Вы должны добавить его после, из-за логики параллелизма:

 1 Take the entire table  
 2 Filter it accordingly  
 3 Select only the ID's  
 4 Make them distinct.  

Если вы делаете выбор Во-первых, предложение Where может содержать только атрибут ID, поскольку все остальные атрибуты уже удалены.

Обновление: для ясности этот порядок операторов должен работать:

db.Items.Where(x=> x.userid == user_ID).Select(x=>x.Id).Distinct();

Вероятно, хотите добавить .toList() в конце, но это необязательно:)

35
ответ дан Ajay2707 3 June 2018 в 07:41
поделиться

Поскольку вы пытаетесь сравнить два разных объекта, вам сначала нужно будет реализовать интерфейс IEqualityComparer. Вот пример кода для простого консольного приложения, в котором используется отличная и простая реализация IEqualityComparer:

 class Program
{
    static void Main(string[] args)
    {
        List<Test> testData = new List<Test>()
        {
            new Test(1,"Test"),
            new Test(2, "Test"),
            new Test(2, "Test")
        };

        var result = testData.Where(x => x.Id > 1).Distinct(new MyComparer());
    }
}

public class MyComparer : IEqualityComparer<Test>
{
    public bool Equals(Test x, Test y)
    {
        return x.Id == y.Id;
    }

    public int GetHashCode(Test obj)
    {
        return string.Format("{0}{1}", obj.Id, obj.Name).GetHashCode();
    }
}


public class Test
{
    public Test(int id, string name)
    {
        this.id = id;
        this.name = name;
    }

    private int id;

    public int Id
    {
        get { return id; }
        set { id = value; }
    }
    private string name;

    public string Name
    {
        get { return name; }
        set { name = value; }
    }
}

Надеюсь, это поможет.

1
ответ дан ScorpiAS 3 June 2018 в 07:41
поделиться
Другие вопросы по тегам:

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