-2

编辑:最初的问题是基于我在下面其他地方看到的这段代码:

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main()
    {
    // List with duplicate elements.
    List<int> list = new List<int>();
    list.Add(1);
    list.Add(2);
    list.Add(3);
    list.Add(3);
    list.Add(4);
    list.Add(4);
    list.Add(4);

    foreach (int value in list)
    {
        Console.WriteLine("Before: {0}", value);
    }

    // Get distinct elements and convert into a list again.
    List<int> distinct = list.Distinct().ToList();

    foreach (int value in distinct)
    {
        Console.WriteLine("After: {0}", value);
    }
    }
}

我为我的问题不够具体而道歉。

4

2 回答 2

0

Distinct正如埃里克所说,不这样做。相反,它会为您提供IEnumerable<T>. 的确切实现Distinct实际上因容器而异。

考虑以下代码片段:

public static class StaticyGoodness
{
    public static void Main()
    {
        var someAs = new List<A>();
        var someBs = new List<B>(); // get it?

        DoTheThings(someAs);
        // Doing things the regular way

        DoTheThings(someBs);
        // Doing things the SPECIALIZED way

        DoTheThings(someBs.OrderBy(b => b.Stuff));
        // Doing things the REALLY SPECIALIZED way
    }

    private static void DoTheThings<T>(this IEnumerable<T> source)
    {
        Console.WriteLine("Doing things the regular way");
    }

    private static void DoTheThings(this IEnumerable<B> source)
    {
        Console.WriteLine("Doing things the SPECIALIZED way");
    }

    private static void DoTheThings(this IOrderedEnumerable<B> source)
    {
        Console.WriteLine("Doing things the REALLY SPECIALIZED way");
    }
}

public class A { }
public class B : A { public int Stuff { get; set; } }

根据你给DoTheThings函数的具体内容,在编译时会绑定不同的重载。 我发现这很令人惊讶。 我认为运行时会根据事物的实际类型而不是其声明的类型在运行时选择更好的候选者(如果有的话)。

例如,如果我们将OrderBy表达式提取到一个局部变量,将其声明为IEnumerable<B>而不是IOrderedEnumerable<B>(例如,我们从存储库方法返回,但不想公开其已排序的实现细节),REALLY SPECIALIZED 调用不会做出来。

IEnumerable<B> plainEnumerable = someBs.OrderBy(b => b.Stuff);
DoTheThings(plainEnumerable);
// Doing things the SPECIALIZED way  :(  (ed.)
于 2013-07-16T01:47:35.877 回答
0

Distinct 类似于 SQL Query 中的 distinct 。

例如:变量distinctElements = duplicatedElements.Distinct();

上面的代码过滤掉重复的条目并返回一个IEnumerable<T>不同的元素。原始的 duplicatedElements 保持不变

于 2013-07-16T01:47:50.663 回答