1

ある配列の要素を別の配列の要素と一致させるラムダ式を作成しようとしています。以下は、このクエリの簡略化されたバージョンです。

class Program
{
    static void Main(string[] args)
    {
        string[] listOne = new string[] { "test1", "test2", "test3" };
        MyClass[] listTwo = new MyClass[] { new MyClass("test1") };

        string[] newVals = listOne.Where(p => listTwo.Select(e => e.Name).Equals(p)).ToArray();

        //string[] newVals2 = listOne.Intersect(listTwo.Select(t => t.Name)).ToArray();
    }

    class MyClass
    {
        public MyClass(string name)
        {
            Name = name;
        }
        public string Name {get; set;}
    }
}

1つの値の配列を返すことを期待newValsしますが、それは空です。myVals2のコメントを外しても同じ結果が得られることはわかっていますが、クラスのリストは表示されているものよりも根本的に異なります。

4

5 に答える 5

4

を使用してEqualsいますが、を使用する必要がありますContainsIEnumerable<>に等しいかどうかを確認していますが、が含まれているpかどうかを確認したいので、次を置き換えます。IEnumerable<>p

string[] newVals = listOne.
                   Where(p => listTwo.Select(e => e.Name).Equals(p)).
                   ToArray();

string[] newVals = listOne.
                   Where(p => listTwo.Select(e => e.Name).Contains(p)).
                   ToArray();
于 2013-01-25T16:14:23.980 に答える
2

これを試して:

string[] listOne = new string[] { "test1", "test2", "test3" };
        MyClass[] listTwo = new MyClass[] { new MyClass("test1") };

        string[] newVals = listOne
                       .Where(p => listTwo.Select(e => e.Name).Contains(p))
                       .ToArray();

listTwo.Select(e => e.Name)IEnumerable<string>

于 2013-01-25T16:14:31.270 に答える
2

あなたはおそらくJoin2つのコレクションでを実行したいと思うでしょう。

var q = 
  listOne
  .Join(
    listTwo,
    l2 => l2,
    l1 => l1.Name,
    (l2, l1) => new { l2, l1, });

セレクター(最後のパラメーター)をニーズに合わせて変更できます。たとえば、listOneの値だけの場合は、があり(l2, l1) => l1ます。

他のソリューションは機能しますが、期待どおりではない可能性があります。

のLinq-ObjectsContainsをwhere句内で使用すると、のエントリに対して全体listTwoが繰り返されます。listOne

于 2013-01-25T16:19:18.727 に答える
1

このようなものはどうですか:

string[] newVals = listOne.Where(p => listTwo.Any(e => e.Name.Contains(p))).ToArray();

==またはの代わりに、より厳密に使用しますContains

しかし、2つの間に共通するアイテムを入手したい場合は、単に電話してみません.Intersect()か?

于 2013-01-25T16:15:35.787 に答える
0

結合を実行しようとしています。技術的には、結合を使用するためにlinqステートメントを単純化することをお勧めします。以下に例を示します。

    static void Main(string[] args)
    {
        string[] listOne = new [] { "test1", "test2", "test3" };
        MyClass[] listTwo = new [] { new MyClass("test1") };

        string[] newVals = (from str1 in listOne
                           join str2 in  listTwo.Select(e => e.Name) on str1 equals str2
                           select str1).ToArray();
        foreach (var newVal in newVals)
        {
            Console.WriteLine(newVal);
        }

        //string[] newVals2 = listOne.Intersect(listTwo.Select(t => t.Name)).ToArray();
    }

    class MyClass
    {
        public MyClass(string name)
        {
            Name = name;
        }
        public string Name { get; set; }
    }
于 2013-01-25T16:21:14.107 に答える