3

リストの一般的なリストがあり、各リストに既に 5 つの等しい数があるかどうかを判断しようとしています。リストに等しいものが見つからない場合は、リストをリストに追加します。このコードは機能しますが、linq についてもっと学びたいです。

LINQ を使用してこれを行う方法。ありがとうございました

private void button2_Click(object sender, EventArgs e)
    {
        int n1 = (int)numericUpDown1.Value;
        int n2 = (int)numericUpDown2.Value;
        int n3 = (int)numericUpDown3.Value;
        int n4 = (int)numericUpDown4.Value;
        int n5 = (int)numericUpDown5.Value;
        int n6 = (int)numericUpDown6.Value;
        int n7 = (int)numericUpDown7.Value;
        int n8 = (int)numericUpDown8.Value;
        int n9 = (int)numericUpDown9.Value;
        int n10 = (int)numericUpDown10.Value;
        int n11 = (int)numericUpDown11.Value;
        int n12 = (int)numericUpDown12.Value;
            list = new List<int>();
            list.Add(n1);
            list.Add(n2);
            list.Add(n3);
            list.Add(n4);
            list.Add(n5);
            list.Add(n6);
            list.Add(n7);
            list.Add(n8);
            list.Add(n9);
            list.Add(n10);
            list.Add(n11);
            list.Add(n12);
            if (data.Count == 0)
                data.Add(list);
            else
            {
                int l = data.Count;
                bool eq =false;
                for (int i = 0; i < l; i++)
                {
                    int count = 0;
                    foreach (int n in list)
                    {
                        if (data[i].IndexOf(n) != -1)
                            ++count;
                        if (count == 5)
                        {
                            eq = true;
                            break;
                        }
                    }
                    if (eq == true)
                        break;
                }
                if (eq == false)
                    data.Add(list);
                else
                {
                    // do nothing
                }
            }

    }
4

4 に答える 4

0

拡張メソッドIntersectを使用できます。Count

何かのようなもの

var exist = false;
foreach (var existingList in data) {
  if (existingList.Intersect(list).Count() >=5) {
    exist = true;
    break;
}

if (!exist) data.Add(list);

ただし、リストのサイズによっては、「交差のチェック> = 5」がリストのすべてのデータと交差するため、パフォーマンスが大幅に低下します。

于 2013-01-17T11:05:08.110 に答える
0

[編集] - 以下の [更新] を参照してください

現在のコードは次のようになるはずです。

...
int count = 0;
for (int i = 0; i < l; i++)
{
    //int count = 0;
    foreach (int n in list)
    {
...

とにかく、あなたの質問に答えるために(あなたが達成したいことを正しく理解していれば)、これを使用できます:

class Program
{
    static List<List<int>> data;
    static List<int> list;
    static void Main(string[] args)
    {
        data = new List<List<int>>();

        for (int i = 0; i < 6; i++)
        {
            list = new List<int>();
            list.Add(1);
            list.Add(2);
            list.Add(1);

            var result = data
                .Union(new[]{list})
                .SelectMany(j => j)
                .GroupBy(j => j)
                .Select(j => new { j.Key, j })
                .Where(j => j.j.Count() > 4);

            if (result.Count() == 0)
                data.Add(list);

        }
    }
}

[アップデート]

OK、あなたが達成したいことを理解したと思います:dataと共通の要素が少なくとも 5 つある他のリストが にない場合listlistを に追加する必要があります。dataこれはList<List<int>>です。

var result = data.Any(i => i.Intersect(list).Count() > 4);
if(!result)
    data.Add(list);
于 2013-01-17T11:15:46.520 に答える
0

各リストにすでに 5 つの等しい数があるかどうかを判断しようとしています。そうでない場合は、それらをリストに追加します

Enumerable.Countたとえば、次のように結合してループできます。

int n1 = (int)numericUpDown1.Value;
foreach(List<int> list in data)
{
    int count = list.Count(i => i == n1);
    while(count++ < 5)
        list.Add(n1);
}
于 2013-01-17T11:04:05.567 に答える
0

投稿したコードを考えると、解決策は次のとおりだと思います。

List<int> list = new List<int>();
List<List<int>> data = new List<List<int>>();

if (data.All(l => l.Intersect(list).Count() < 5))
    data.Add(list);
于 2013-01-17T12:17:22.740 に答える