20

LINQ を使用すると、多くのプログラミングの問題をより簡単に、より少ないコード行で解決できます。

あなたが書いた実世界のLINQ-to-Objectsクエリで最高のものは何ですか?

(ベスト = C# 2.0 / 命令型アプローチと比較したシンプルさとエレガンス)。

4

9 に答える 9

8

リスト内の null 項目を除外します。

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の匿名メソッドの構文は冗長すぎました。)

ここに1つの小さな例があります:

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

私は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

別のリスト(つまりList<Palette> palettes)を含むオブジェクトを含むリスト(つまりPalette.Colors)があり、それらすべてのサブリストを1つにフラット化する場合:

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#の全機能をテキスト変換に適用できます。通常、複雑な方法で抽出および操作したい1つの言語のコードがある場合に使用します。テキストを単独で、LinqPadにスローし、引用符を「検索-置換」して、二重引用符に置き換えます。私はそれを囲んで@"..."仕事に取り掛かります。私は通常、30秒ほどで大規模なコード変換を行うことができます。

于 2011-02-21T23:23:18.147 に答える
0

私を始めて、その素晴らしいです!

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

私のお気に入りは、 NorthwindデータベースからSQL テーブルを動的に並べ替える次の Linq の例です。

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)andを使用することで、ページングを簡単に実装.Skip(y)することもできます。

于 2013-06-11T08:32:24.917 に答える