■91969 / inTopicNo.8) |
Re[3]: 複数の条件を満たしかつ重複をなくしてリストにする方法 |
□投稿者/ WebSurfer (1870回)-(2019/08/15(Thu) 11:45:53)
|
■No91964 (河童 さん) に返信
> Linq での方法をお教えください。
サンプルコードを下に書いておきますので見てください。
> WHERE条件を動的に組み立てるには、どうのように設定するのでしょうか?
サンプルコードの Where メソッドの引数を見てください。
重複排除に関し一点注意。IEnumerable<T> で T が匿名型の場合は Distinct() メソッドで期待通り重複のない結果が得られますが、T にカスタムデータ型を使った場合は以下の 1 または 2 を実装する必要があります。
匿名型と Distinct メソッド
http://surferonwww.info/BlogEngine/post/2015/12/08/anonymous-type-and-distinct-method.aspx
以下のサンプルコードでは 1 の方法を使っています。
また、サンプルコードでは「グループ」の重複のみチェックしてますが、「シリーズ」「プロセス」も条件に加えたい場合は質問者さんの方で適宜変更してください。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleAppDistinct
{
public class DataGroup : IEquatable<DataGroup>
{
public string siries { get; set; }
public string process { get; set; }
public string group { get; set; }
public bool Equals(DataGroup other)
{
if (Object.ReferenceEquals(other, null)) return false;
if (Object.ReferenceEquals(this, other)) return true;
return group.Equals(other.group);
}
// If Equals() returns true for a pair of objects
// then GetHashCode() must return the same value for these objects.
public override int GetHashCode()
{
return group.GetHashCode();
}
}
class Program
{
static void Main(string[] args)
{
List<DataGroup> setGroup = new List<DataGroup>
{
new DataGroup { siries = "S1", process = "P1", group = "G1" },
new DataGroup { siries = "S1", process = "P2", group = "G2" },
new DataGroup { siries = "S1", process = "P3", group = "G3" },
new DataGroup { siries = "S2", process = "P1", group = "G1" },
new DataGroup { siries = "S2", process = "P2", group = "G2" },
new DataGroup { siries = "S2", process = "P3", group = "G3" },
new DataGroup { siries = "S3", process = "P1", group = "G4" },
new DataGroup { siries = "S3", process = "P2", group = "G5" },
new DataGroup { siries = "S3", process = "P3", group = "G6" }
};
string s = string.Empty;
string p = "P1";
IEnumerable<DataGroup> newlist = setGroup.
Where(g => (string.IsNullOrEmpty(s) ? true : g.siries == s) &&
(string.IsNullOrEmpty(p) ? true : g.process == p));
foreach (DataGroup g in newlist)
{
Console.WriteLine($"siries: {g.siries}, process: {g.process}, group: {g.group}");
}
// 結果は:
// siries: S1, process: P1, group: G1
// siries: S2, process: P1, group: G1
// siries: S3, process: P1, group: G4
Console.WriteLine("-------------------------");
foreach (DataGroup g in newlist.Distinct())
{
Console.WriteLine($"siries: {g.siries}, process: {g.process}, group: {g.group}");
}
// 結果は:
// siries: S1, process: P1, group: G1
// siries: S3, process: P1, group: G4
}
}
}
|
|