20

使用 LINQ,可以更轻松地解决许多编程问题 - 并且使用更少的代码行。

你写过哪些最好的真实世界的LINQ-to-Objects查询?

(与 C# 2.0 / 命令式方法相比,最佳 = 简单和优雅)。

4

9 回答 9

8

过滤掉列表中的空项。

var nonnull = somelist.Where(a => a != null);

创建一个字典,其中键是属性的值,值是该属性在列表中出现的次数。

var countDictionary = somelist
    .GroupBy(a => a.SomeProperty)
    .ToDictionary(g => g.Key, g => g.Count());
于 2009-02-04T09:04:14.147 回答
4

LINQ 只是在 C#/VB 中添加了一些函数式编程概念。因此,是的,大多数事情都会变得容易得多。C# 2.0 实际上有一些这样的——例如,参见 List 方法。(尽管 C# 2.0 中的匿名方法语法过于冗长。)

这是一个小例子:

static readonly string badChars = "!@#$%^&*()";
bool IsUserNameValid(string userName) {
  return userName.Intersect(badChars).Any();
}
于 2009-02-04T20:03:11.010 回答
3

示例 1

返回本地网络中所有可用 SQL Server 实例名称的列表

private List<string> GetServerNames()
{
    return SqlDataSourceEnumerator.Instance.GetDataSources().Rows.
        Cast<DataRow>().
        Select
        (
            row => row["ServerName"].ToString() + 
                  (row["InstanceName"] != DBNull.Value ? "\\" + row["InstanceName"].ToString() : "") + 
                  (row["Version"] != DBNull.Value ? " (" + row["Version"].ToString().Substring(0, 3) + ")" : "")
        ).
        OrderBy(s => s).
        ToList();
}

示例 2

为新文件生成未使用的名称

private string NewName(string newNamePrefix, List<string> existingFileNames)
{
    return newNamePrefix + 
        (existingFileNames.
            Select
            (
                n =>
                {
                    if (n.StartsWith(newNamePrefix))
                    {
                        int i;
                        if (int.TryParse(n.Replace(newNamePrefix, ""), out i))
                            return i;
                    }

                    return 0;
                }
            ).
            OrderBy(i => i).
            Last() + 1
        );
}
于 2009-05-21T06:45:23.577 回答
2

我有两个我喜欢的非常荒谬但优雅的例子

public static IEnumerable<bool> Information(this byte x)
{
    return Enumerable.Range(0, 8).Select(i => ((x >> i) & 1) == 1);
}

public static IEnumerable<bool> Information(this IEnumerable<byte> xs)
{
    return xs.SelectMany(Information);
}

尽管这些被封装为查询运算符,因此您可以重用它们,例如用于二进制解析

var n = bytes.Information().Skip(3).Take(16).ToInt();
于 2010-02-18T07:57:24.107 回答
2

如果你有一个分隔Name=Value字符串,比如"ID=2;Name=James;Age=32;"你想快速把它变成字典,你可以使用:

var dict = value.Split(new[] { ";" }, StringSplitOptions.RemoveEmptyEntries)
    .Select(str => str.Split('='))
    .ToDictionary(pair => pair[0], pair => pair[1]);
于 2010-02-18T08:04:03.930 回答
1

如果您有一个列表 (ie List<Palette> palettes),其中包含包含另一个列表 (ie Palette.Colors) 的对象,并且想要将所有这些子列表扁平化为一个:

List<Color> allColors = palettes.SelectMany(p => p.Colors);
于 2009-05-20T23:46:41.920 回答
0

在移植代码时,我喜欢在文本上使用 LINQ:

例如:

String.Join("\n", @"some VB6 code
    that I could refactor automatically
    if FindAndReplace were a bit more powerfully
    And I don't want to refactor by hand".Split('\n').Trim().Select(line =>
    {
        if(line.Contains("FindAndReplace") && !line.StartsWith("//"))
        {
            return line.Split(" ").Last();
        }
        else
        {
            return String.Join("_", line.Split(" ").Take(3));
        }
    });

你明白了。Linq 让我可以将 C# 的全部功能应用于文本转换。通常,当我想要以一种复杂的方式提取和操作一种语言的代码时,我会使用它,我将文本单独放在 LinqPad 中并在引号上执行“查找替换”,用双引号替换它们,然后我围着它@"..."开始工作。我通常可以在 30 秒左右完成大量的代码转换。

于 2011-02-21T23:23:18.147 回答
0

让我开始了,它太棒了!

var myList = from list in myObjectList select list
于 2009-02-04T08:38:53.323 回答
0

我最喜欢的是以下 Linq 示例,用于从Northwind数据库中动态排序 SQL 表:

void Main()
{

// Demonstrates dynamic ordering

var SortExpression = "Total"; // choose ProductName or Total
var sortAscending = true; // choose true for ascending, false for descending

// the query to sort
var data = (from pd in Products
                    join od in OrderDetails on pd.ProductID equals od.ProductID into DetailsByProduct
                    select new { ProductName = pd.ProductName, Total = DetailsByProduct.Count()}).ToList();

// the data source you can use for data binding                     
var ds= (sortAscending) 
    ? data.OrderBy(x => x.GetType().GetProperty(SortExpression).GetValue(x, null))
    : data.OrderByDescending(x => x.GetType().GetProperty(SortExpression).GetValue(x, null));

ds.Dump();
}

它允许您通过简单地指定变量中的字段和变量中SortExpression的排序顺序来动态排序sortAscending

通过使用.Take(x).Skip(y)您也可以轻松实现分页

于 2013-06-11T08:32:24.917 回答